1. 程式人生 > 實用技巧 >HDU4764 Stone

HDU4764 Stone

思路

可以將題目轉化為 \(n-1\) 顆石子每次可取 \(1\sim k\) 顆的巴什博奕問題,也可以手算找規律。

\(n=1\) 時,後手勝。

\(n=2\sim k+1\) 時,先手勝。

\(n=k+2\) 時,後手勝。

\(n=k+3\sim2k+2\) 時,先手勝。

……

然後就發現滿足 \((n-1)\mod (k+1) = 0\) 時後手勝,否則先手勝。

程式碼

/*
Author: Loceaner
知識點: 巴什博奕 
*/
#include <cmath>
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

inline int read() {
  char c = getchar(); int x = 0, f = 1;
  for ( ; !isdigit(c); c = getchar()) if (c == '-') f = -1;
  for ( ; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);
  return x * f;
}

int n, k;

int main() {
  while (scanf("%d%d", &n, &k) && n && k) {
    if ((n - 1) % (k + 1) == 0) puts("Jiang");
    else puts("Tang");  
  }
  return 0;
}