2013 ACM/ICPC 长春网络赛F题
题意:两个人轮流说数字,第一个人可以说区间[1~k]中的一个,之后每次每人都可以说一个比前一个人所说数字大一点的数字,相邻两次数字只差在区间[1~k]。谁先>=N,谁输。问最后是第一个人赢还是第二个人赢。
分析:必胜策略是这样的,想方设法抢到N-1,这样下一个人必然会>=N。
第一个人抢到N-1的方法,就是先说一个数字与N-1的差是k+1的整数倍。
因为在这之后另一个人无论说几,第一个人只要把数字补齐到与N-1差k+1的整数倍即可。
例如另一个人让数字增加a,那么第一个人则让数字增加k+1-a。这样就必然可以抢到N-1。
也有一种情况是第一个采取这种策略,如果N-1本来就是k+1的倍数,那么第一个人无论说几都无法达到与N-1差k+1的整数倍,这样第二个人就可以采取我们刚才说的补齐策略来抢到N-1。则第二个人获胜。
综上,如果(N-1)%(k+1)==0则第二个人赢,否则第一个人赢。
#include <cstdio> using namespace std; int N, k; int main() { while (scanf("%d%d", &N, &k), N | k) { if ((N - 1) % (k + 1) == 0) printf("Jiang\n"); else printf("Tang\n"); } return 0; }