一堆数量为 nnn 的石子摆在牛牛和牛妹面前,由于双方都是博弈大师,它们打算一决高下。
经过双方讨论后决定的游戏规则:采取回合制游戏,双方轮流操作一回合。第 iii 回合的操作者会从石头堆中拿走 iii 个石子 ((( 第 111 回合拿走 111 个,第 222 回合拿走 222 个,以此类推 )))。若第 iii 回合的时候,石子的总数小于 iii,那么该回合的操作者会输掉比赛。由于牛牛是个绅士牛,所以打算第一回合让牛妹先操作,第二回合牛牛操作,第三回合再次轮到牛妹操作。
除此之外,牛牛拥有 aaa 张技能卡,牛妹拥有 bbb 张。
技能卡的作用:技能卡可以在任意时刻发动,每个回合任意一方可以发动多次,每次消耗一张卡。发动技能卡时,可以改变当前回合的操作者。
例如第 iii 回合是牛牛操作,此时无论谁发动该回合的第一张技能卡,第 iii 回合的操作者就会变成牛妹。如果此时有人发动该回合的第二张卡,那么操作者又会变成牛牛,以此类推,直到该回合双方都不再发动技能卡,此时操作者再进行操作。
需要注意的是,如果该回合使用了卡导致操作者最终发生了改变,那么下一回合的初始操作者也随之改变。例如:第一回合是牛妹操作,牛牛使用了一张卡,这一回合实际操作者是牛牛,那么第二回合的初始操作者就会是牛妹。
问:双方都采取最佳策略,谁会是这场比赛的胜利者?
分析:
1.谁的卡多谁就能保证自己赢。
2.如果俩人的卡数目相同考虑n的取值范围。推出i=1:n=1,2牛妹赢;i=2,n=3,4,5牛牛赢;i=3,n=6,7,8,9牛妹赢......下标为奇数,牛妹赢;偶数,牛牛赢。
所以通过输入的n来确定具体的i为多少即可。
看每个i的第一项排列为1,3,6,10,15。通项an = (n+1)* n / 2;输入的n一定是大于等于an的,故(n+1)* n / 2 <= x,得到 n* n / 2 < x,即n > sqrt(2*x),此时的n为下界。代回:
LL p = sqrt(2*n);
while(1ll * p * (p+1) / 2 < n) ++p;
此时的p即为对应下标,做出相应判断即可
代码如下:(注意开long long)
int tt;
cin >> tt;
while(tt--){
LL n, a, b;
cin >> n >> a >> b;
if(a > b){
puts("niuniu");
}
else if(a < b){
puts("niumei");
}
else{
LL p = sqrt(2*n);
while(1ll * p * (p+1) / 2 < n) ++p;
puts((p & 1) ? "niumei":"niuniu");
}
}