思路:

这就是K倍动态减法游戏,可以参考曹钦翔从“k倍动态减法游戏”出发探究一类组合游戏问题的论文。
首先k=1的时候,必败态是2^i,因为我们把数二进制分解后,拿掉最后一个1,那么会导致对方永远也取不完,我们可以拿到最后一个1.
k=2的时候,必败态是斐波那契数列,因为任何一个整数n都可以写成两项斐波那契数的和,所以我们拿掉1,对方永远取不完高两位的数。
k的时候我们必须构造数列,将n写成数列中一些项的和,使得这些被取到的项的相邻两个倍数差距>k 那么每次去掉最后一个1 还是符合上面的条件。设这个数列已经被构造了i 项,第 i 项为a[ i ],前 i 项可以完美对1..b[ i ] 编码使得每个编码的任意两项倍数>K 那么有

a[ i+1 ] = b[ i ] + 1;这是显然的 因为b[ i ] + 1没法构造出来,只能新建一项表示

然后计算b[ i+1] 既然要使用 a[ i+1 ] 那么下一项最多只能是某个 a[ t ] 使得 a[ t ] * K < a[ i+1 ] 于是

b[ i ] = b[ t ] + a[ i+1 ]

然后判断n是否在这个数列里面

如果在,那么先手必败。否则不停的减掉数列a中的项构造出n的分解,最后一位就是了。

代码如下:

 #include<cstdio>
int a[],b[];
int main()
{
int i,j,t,n,k,c=,ans;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&k);
i=j=;
a[]=b[]=;
while(a[i]<n){
i++;
a[i]=b[i-]+;
while(a[j+]*k<a[i]) j++;
if(a[j]*k<a[i]) b[i]=b[j]+a[i];
else b[i]=a[i];
}
printf("Case %d: ",++c);
if(a[i]==n) puts("lose");
else{
while(n){
if(n>=a[i]){
n-=a[i];
ans=a[i];
}
i--;
}
printf("%d\n",ans);
}
}
return ;
}

最新文章

  1. Oracle(DML)
  2. ZooKeeper 笔记(3) 实战应用之【统一配置管理】
  3. iOS使用textfield注意的细节
  4. 二叉搜索树BinarySearchTree(C实现)
  5. 游戏引擎/GUI的设计与实现-序
  6. Liunx0000(初步认识)
  7. MVC-05 Model(2)
  8. BZOJ 3163: [Heoi2013]Eden的新背包问题( 背包dp )
  9. 字符编码详解 good
  10. OpenCms创建网站过程图解——献给OpenCms的初学者们
  11. (八十九)用AutoLayout实现动画和Label根据内容自动调整
  12. JAVA之旅(十)——异常的概述,Try-Catch,异常声明Throws,多异常处理,自定义异常,Throw和Throws的区别
  13. CSc 352 (Spring 2019): Assignment
  14. 第一章:深入web请求过程
  15. 零基础爬虫----python爬取豆瓣电影top250的信息(转)
  16. Chrome插件(扩展)开发全攻略
  17. windows下搭建permeate漏洞测试系统实战
  18. sql server中带有output的DML
  19. [四]SpringBoot 之 捕捉全局异常
  20. 基础篇:6.5)形位公差-公差带 Tolerance Zone

热门文章

  1. 《shell下sort排序命令的使用》
  2. 用CSS实现Firefox 和IE 都支持的Alpha透明效果
  3. android的入门学习
  4. WINDOWS下更改MYSQL数据路径(datadir)后服务启动1067解决不能改变mysql数据库存储位置
  5. Linux驱动开发之开篇--HelloWorld
  6. SVN备份教程(三)
  7. C预处理,条件编译
  8. RUP(Rational Unified Process)
  9. C++中的虚函数(类的向上转换,和向下转换)
  10. bw R/3端配置 (转)