ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

The 16-th BIT Campus Programming Contest - Online Round--Easy Nim

2022-01-12 11:59:28  阅读:301  来源: 互联网

标签:先手 后手 Contest -- 魔法 张牌 必胜 倍数 Easy


Problem - C - Codeforcesicon-default.png?t=LBL2https://codeforces.com/gym/103401/problem/C题目大意为每人每轮最多拿m张牌,谁先取完n张牌谁胜;后手有k张魔法牌,每张魔法牌上写有数字(这里把数字放在c数组里)可以将修改上限变为牌上的数字,发动魔法牌时不能取牌。

拿牌(取石子游戏)有一个必胜策略是将n张牌的剩余个数拿到(m+1)的倍数

(先手不能发动魔法牌,所以只是个无情的拿(m+1)的倍数的机器人)

例如:10张牌,每人最多拿3张,这样的话先手必胜,下面的过程着重看先手拿剩几张牌

先手拿1张,剩余9张,后手拿3张,剩余6张;

先手拿2张,剩余4张,后手拿1张,剩余3张;

先手拿3张,剩余0张,先手获胜;

先手的赢面很大,除了n=(m+1)的倍数,后手必胜的情况。

回到这道题,

        显然,当m>=n时,先手必胜;

        当n=(m+1)的倍数,后手必胜的情况时,先手不能发动魔法牌,所以不能扭转局面,于是先手必败;

        当n!=(m+1)时,先手拿牌拿到n=n-n%(m-1),这时后手有两种情况获胜。

        第一种魔法牌中有(m+1)的倍数刚好是(c[i]+1)的倍数,后手发动牌技能(同时n>c[i]),这样就后手必胜了,也就是说判断条件为只要n大于(c[i]+1)和(m+1)的最小公倍数,那么无论先手怎么取,后手都能控制到(c[i]+1)的倍数;

if(n>(c[i]+1)*(m+1)/__gcd(c[i]+1,m+1)){
    cout<<"zyw";
}

        第二种是魔法牌的组合,魔法牌中有(c[i]+1)的倍数刚好是(c[j]+1)的倍数,后手先发动c[i](n>c[i]),之后n=n-n%(c[i]+1),这时n是c[i]+1的倍数,然后后手发动c[j](n>c[j]),如果这时n也是c[j]+1的倍数,那么后手就获胜。

if((c[i]+1)*(c[j]+1)/__gcd(c[i]+1,c[j]+1)<=(n-min(n%(c[i]+1),n%(c[j]+1)))){
    cout<<"zyw";
}

如果这些情况都没有,那么先手必胜。

标签:先手,后手,Contest,--,魔法,张牌,必胜,倍数,Easy
来源: https://blog.csdn.net/zy98zy998/article/details/122448645

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有