取出石子
题目
给定1-N个石子,序号依次为1-N,先随机从石堆中取出两个石子,编号i,j,2人轮流取出石子,其编号k必定满足存在已经取出的编号k=p+q,or k=p-q,最后取不出的人输,问先手还是后手胜
思路
任意取出石子 T = k1i+k2j,(k1,k2属于整数集) ,则淘汰之前双方一定会把能够组成的最小编号F取出,floor(N/F)则为总共步数
一些问题
F怎么算
对于i,j(i>j),必然要让i-足够多的j,结果显然是i%j,(i%j) < j 所以接下来反复就是(j%(i%j)),反复下去就是辗转相除,F = gcd(i,j);
N/F为什么是总共步数,为什么不会少也不会多
考虑仍然能有石子满足k1i+k2j,则其必然为F的倍数,则其不能被去除条件是不存在N1+N2 = k1i+k2j , N1,N2又都是正整数且是F倍数,反复推出F没有被去除,相违背,证完了。
代码
using namespace std;
int T;
int get_foundation(int x, int y) {
return __gcd(x, y);
}
int main() {
//freopen("stone.in", "r", stdin);
//freopen("stone.out", "w", stdout);
scanf("%d", &T);
while (T--) {
int n, x, y;
scanf("%d%d%d", &n, &x, &y);
int F = get_foundation(x, y);
int t = n / F;
if (t % 2 == 0) printf("A\n");
else
printf("B\n");
}
}

浙公网安备 33010602011771号