文章地址:http://henuly.top/?p=370
题目:
Tang and Jiang are good friends. To decide whose treat it is for dinner, they are playing a game. Specifically, Tang and Jiang will alternatively write numbers (integers) on a white board. Tang writes first, then Jiang, then again Tang, etc… Moreover, assuming that the number written in the previous round is X, the next person who plays should write a number Y such that 1 <= Y - X <= k. The person who writes a number no smaller than N first will lose the game. Note that in the first round, Tang can write a number only within range [1, k] (both inclusive). You can assume that Tang and Jiang will always be playing optimally, as they are both very smart students.
Input:
There are multiple test cases. For each test case, there will be one line of input having two integers N (0 < N <= 10^8) and k (0 < k <= 100). Input terminates when both N and k are zero.
Output:
For each case, print the winner’s name in a single line.
Sample Input:
1 1
30 3
10 2
0 0
Sample Output:
Jiang
Tang
Jiang
题目链接
每个人出一个1~K的数,当所有数之和到达N时最后一个出数的人输,若想要取得游戏的胜利必须在出数之后所有数之和达到n-1,此时就变为n-1个石子的巴什博弈原型题目。
AC代码:
#include <bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define pb push_back
#define mp make_pair
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> P;
const int INF = 0x3f3f3f3f;
const int maxn = 2e5+5;
const int mod = 1e9+7;
const double eps = 1e-8;
const double pi = asin(1.0)*2;
const double e = 2.718281828459;
void fre() {
freopen("out.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
}
int main(){
//fre();
int n, k;
while (scanf("%d%d", &n, &k) != EOF, n, k) {
if ((n - 1) % (k + 1)) {
printf("Tang\n");
}
else {
printf("Jiang\n");
}
}
return 0;
}