UVALive 4123 Glenbow Museum (组合数学)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud
易得,当n为奇数或者n<3时,答案为0,否则该序列中必定有(n+4)/2个R,(n-4)/2个O;
要使该序列的排列能成立,则只需要保证(在首尾相连之后)该序列中依旧不存在相连的两个O即可;
从而可以得出当n为大于等于4的偶数时,答案等于C(n/2+1,3)+2*C(n/2+1,4);
当然,大白书还有介绍dp的方法。
1 #include <iostream> 2 using namespace std; 3 typedef long long ll; 4 ll C[1010][5]; 5 ll ans[1010]; 6 int main() 7 { 8 ios::sync_with_stdio(false); 9 C[0][0]=1; 10 for(int i=1;i<1010;i++) 11 { 12 C[i][0]=1; 13 for(int j=1;j<5;j++) 14 { 15 C[i][j]=C[i-1][j-1]+C[i-1][j]; 16 } 17 } 18 for(int i=4;i<1010;i++) 19 { 20 if(i&1)continue; 21 else ans[i]=2*C[i/2+1][4]+C[i/2+1][3]; 22 } 23 int n,cas=1; 24 while(cin>>n&&n) 25 { 26 cout<<"Case "<<cas++<<": "<<ans[n]<<endl; 27 } 28 return 0; 29 }