组合计数
排列组合求总方案数
这个可以用一个一维的动态规划解决:
f[i][0]表示第i头牛是牝牛的方案数
f[i][1]表示第i头牛是牡牛的方案数
则转移为:f[i][0]=f[i-1][0]+f[i-1][1];
f[i][1]=f[i-K-1][0]+f[i-K-1][1];
常数优化:将取模运算改为if判断语句……可从20ms降为16ms
1 /************************************************************** 2 Problem: 3398 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6 Time:16 ms 7 Memory:1588 kb 8 ****************************************************************/ 9 10 //BZOJ 3398 11 #include<cstdio> 12 #define F(i,j,n) for(int i=j;i<=n;++i) 13 int getint(){ 14 int v=0,sign=1; char ch=getchar(); 15 while(ch<‘0‘||ch>‘9‘) {if (ch==‘-‘) sign=-1; ch=getchar();} 16 while(ch>=‘0‘&&ch<=‘9‘) {v=v*10+ch-‘0‘; ch=getchar();} 17 return v*=sign; 18 } 19 const int N=100086,P=5000011; 20 int f[N][2],n,K; 21 int main(){ 22 n=getint(); K=getint(); 23 f[1][0]=f[1][1]=1; 24 F(i,2,n){ 25 if(i-K-1>0) f[i][1]=f[i-K-1][0]+f[i-K-1][1]; 26 else f[i][1]=1; 27 f[i][0]=f[i-1][0]+f[i-1][1]; 28 if(f[i][0]>=P) f[i][0]-=P; 29 if(f[i][1]>=P) f[i][1]-=P; 30 } 31 printf("%d\n",(f[n][0]+f[n][1])%P); 32 return 0; 33 }
时间: 2024-10-09 15:33:44