1. 程式人生 > >codeforces#1090 D. New Year and the Permutation Concatenation(打表找規律)

codeforces#1090 D. New Year and the Permutation Concatenation(打表找規律)

.com 長度 clear name 分享圖片 ++ 全排列 找到 true

題意:給出一個n,生成n的所有全排列,將他們按順序前後拼接在一起組成一個新的序列,問有多少個長度為n的連續的子序列和為(n+1)*n/2

題解:由於只有一個輸入,第一感覺就是打表找規律,雖然表打出來了,但是依然沒有找到規律。。。最後看了別人的題解才發現

技術分享圖片

ans [ 3 ] = 1*2*3 + ( ans [ 2 ] - 1 ) * 3

ans[ 4 ] = 1*2*3*4 + ( ans[ 3 ] - 1 ) * 4

感覺每次離成功就差一點點!!!

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=6e5+10;
int num[maxn];
vector<int>ve;
int main()
{
    int k=8;
    while(k--)
    {
        ve.clear();
        cout<<k<<" ";
        for(int i=0; i<maxn; i++)
            num[i]=i;
        do
        {
            for(int i=1; i<=k; i++)
                ve.push_back(num[i]);
        }
        while(next_permutation(num+1,num+k+1));
        int ans=0;
        for(int i=0; i<ve.size(); i++)
        {
            for(int j=i; j<ve.size(); j++)
            {
                if(j-i+1!=k)continue;
                ll cal=0;
                for(int l=i; l<=j; l++)
                    cal+=ve[l];
                if(cal==(k+1)*k/2)
                    ans++;
            }
        }
        cout<<ans<<endl;
    }

    return 0;
}

  

codeforces#1090 D. New Year and the Permutation Concatenation(打表找規律)