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 }
View Code

 

你可能感兴趣的:(live)