这道题可以用递推做,但是没有必要
首先说长度为L
假设R的个数为x,O的个数为y,那么x+y=L而且x-y=4
当L为奇数和小于4的时候肯定不可以
由于O不能相邻 可以假设O 的数目和R一样多,交叉排放。然后从这些O中
去掉4个
1,R开头的情况 C(x,4)
2,O开头的情况C(x-1,4)
然后两种情况相加即可
代码:
#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #define ll long long using namespace std; ll C(int n,int m) { ll tmp=1; for(int i=0;i<m;++i) tmp=tmp*(n-i); for(int i=1;i<=m;++i) tmp=tmp/i; return tmp; } int main() { //freopen("data.in","r",stdin); int ca=0; int n; while(cin>>n) { ++ca; if(!n) break; cout<<"Case "<<ca<<": "; if(n<4||n%2==1) cout<<"0"<<endl; else cout<<C((n+4)/2,4)+C((n+4)/2-1,4)<<endl; } return 0; }