codeforces#1090 D. New Year and the Permutation Concatenation(打表找規律)
阿新 • • 發佈:2019-01-01
.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(打表找規律)