首页 > 其他 > 详细

bzoj 2281: [Sdoi2011]黑白棋

时间:2017-03-03 23:00:43      阅读:208      评论:0      收藏:0      [点我收藏+]

再次,,,,,虚(一开始看错题了,看成一次移动一个棋子,能移动1-d个格子。。。这样的话有没有大神会做??本蒟蒻就教)

额,,直接%%%%把。。。http://hzwer.com/5760.html

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<map>
 5 #include<queue>
 6 #define N 1000005
 7 #define inf 1000000000
 8 #define LL long long
 9 using namespace std;
10 const LL mod=1e9+7;
11 LL tot,ans;
12 int n,K,d,p;
13 LL bin[25];
14 LL c[10005][205],f[25][10005];
15 void pre()
16 {
17     for (int i=0; i<=n; i++) c[i][0]=1;
18     for (int i=1; i<=n; i++)
19         for (int j=1; j<=min(2*K,i); j++)
20             c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
21 }
22 int C(int x, int y)
23 {
24     if (y>x-y) y=x-y;
25     return c[x][y];
26 }
27 void add(LL &x, LL y)
28 {
29     x=(x+y)%mod;
30 }
31 int main()
32 {
33     bin[0]=1; for (int i=1; i<=15; i++) bin[i]=bin[i-1]<<1;
34     scanf("%d %d %d",&n,&K,&d); K/=2; pre(); f[0][0]=1;
35     for (int i=0; i<15; i++)
36         for (int j=0; j<=n-2*K; j++)
37             for (int k=0; k*(d+1)<=K && j+(d+1)*k*bin[i]<=n-2*K; k++)
38             {
39                 add(f[i+1][j+k*(d+1)*bin[i]],f[i][j]*C(K,k*(d+1)));
40             }
41     for (int i=0; i<=n-2*K; i++)
42         add(ans,f[15][i]*C(n-i-K,K));
43     tot=C(n,K*2);
44     cout<<(tot+mod-ans)%mod;
45     return 0;
46 }

 

bzoj 2281: [Sdoi2011]黑白棋

原文:http://www.cnblogs.com/ccd2333/p/6498509.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!