转载请注明出处: 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的方法。
#include <iostream>
using namespace std;
typedef long long ll;
ll C[][];
ll ans[];
int main()
{
ios::sync_with_stdio(false);
C[][]=;
for(int i=;i<;i++)
{
C[i][]=;
for(int j=;j<;j++)
{
C[i][j]=C[i-][j-]+C[i-][j];
}
}
for(int i=;i<;i++)
{
if(i&)continue;
else ans[i]=*C[i/+][]+C[i/+][];
}
int n,cas=;
while(cin>>n&&n)
{
cout<<"Case "<<cas++<<": "<<ans[n]<<endl;
}
return ;
}