首先看出终止状态是全都堆在左边或者右边,然后发现黑的向左白的向右是最优策略(如果不能这样了也就该输了)

然后就不会了

参考 http://www.cnblogs.com/CQzhangyu/p/7707746.html

发现黑白之间的距离一定是不断缩小的,就相当于k堆石子,每次从1~d堆里拿走一些,根据nimk,二进制位下每一位的和都是d+1的倍数则先手必输(可以看成高配的巴什博奕)

然后设f[i][j]为前i位用了j石子,用组合数转移:f[i+1][j]=(f[i+1][j]+f[i][j-(1ll<<i)k(d+1)]c[m/2][(d+1)k])%mod

#include<iostream>
#include<cstdio>
using namespace std;
const long long N=10005,mod=1e9+7;
int n,m,d;
long long f[20][N],c[N][105],ans;
int main()
{
scanf("%d%d%d",&n,&m,&d);
for(int i=0;i<=n;i++)
{
c[i][0]=1;
for(int j=1;j<=i&&j<=m;j++)
c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
}
f[0][0]=1;
for(int i=0;i<16;i++)
for(int j=0;j<=n-m;j++)
for(int k=0;(1ll<<i)*(d+1)*k<=j&&(d+1)*k<=m/2;k++)
f[i+1][j]=(f[i+1][j]+f[i][j-(1ll<<i)*k*(d+1)]*c[m/2][(d+1)*k])%mod;
for(int i=0;i<=n-m;i++)
ans=(ans+f[16][i]*c[n-i-m/2][m/2])%mod;
printf("%lld",(c[n][m]-ans+mod)%mod);
return 0;
}

最新文章

  1. Object Removal by Exemplar-Based Inpainting 概括(附源码)
  2. #Deep Learning回顾#之基于深度学习的目标检测(阅读小结)
  3. thinkphp的field方法的用法
  4. 20145337 《Java程序设计》第二周学习总结
  5. iOS开发笔记7:Text、UI交互细节、两个动画效果等
  6. Maven 迁移local repository
  7. Python 正则表达式-OK
  8. OC学习-1
  9. Objective-c中autorelease的释放时机
  10. windows7下,protel 99se元件库加载问题的解决方案
  11. C# Best Practices - Define Fields Appropriately
  12. python注意事项
  13. UIButton图片文字控件位置自定义(图片居右文字居左、图片居中文字居中、图片居左文字消失等)
  14. ES6 学习笔记之二 块作用域与闭包
  15. shell if条件判断中:双中括号与单中括号的区别
  16. java servlet的执行流程
  17. 举例跟踪linux内核系统调用
  18. 知识点---animate()动画滞后执行的解决方案
  19. qt资源加载出错
  20. 爬虫模块之解决IO

热门文章

  1. 【源代码】LruCache源代码剖析
  2. 最简单的基于FFmpeg的AVDevice样例(读取摄像头)
  3. dubbo springCloud比较
  4. JRE、JDK、JVM区别和联系
  5. ViewGroup如何分发事件
  6. Mac中Maven的安装步骤
  7. Spark简单集群搭建
  8. luogu3373 【模板】线段树2
  9. HDU 6109 数据分割 【并查集+set】 (2017&quot;百度之星&quot;程序设计大赛 - 初赛(A))
  10. window10 java 环境变量配置