巴什博弈
思路
N個石子,每次取1 - M個,取完的勝。
當剩余的石子為1 + M 后手勝,只需要判斷N是否為(1 + M)的倍數。
練習
HDU 1846
#include<bits/stdc++.h> #define N 200005 using namespace std; vector <pair<int, pair<int, int>>> ve; int main () {// freopen("in.txt", "r", stdin);int c;scanf("%d", &c);while(c--) {int n, m;scanf("%d%d",&n, &m);if (n % (m + 1)) printf("first\n");else printf("second\n");}return 0; }HDU 1847
思路
kiki面臨3的時候必輸,任何數都可以通過減0,減1,減2變成3的倍數,所以誰面臨3的倍數誰就輸。
#include<bits/stdc++.h> #define N 200005 using namespace std; vector <pair<int, pair<int, int>>> ve; int main () {// freopen("in.txt", "r", stdin);int n;while(~scanf("%d", &n)) {if (n % 3) printf("Kiki\n");else printf("Cici\n");}return 0; }HDU 4764
思路
如果N = (1 + M) * K + 1, 這樣第一個人寫X,第二個人總可以寫1 + M - X,到最后第一個人無論寫多少都會>= N,所以 N = (1 + M) * K + 1 為奇異局勢。
#include<bits/stdc++.h> #define N 200005 using namespace std; vector <pair<int, pair<int, int>>> ve; int main () {// freopen("in.txt", "r", stdin);int n, m;while (scanf("%d%d", &n, &m), n + m) {if((n - 1) % (1 + m)) printf("Tang\n");else printf("Jiang\n");}return 0; } 與50位技術專家面對面20年技術見證,附贈技術全景圖總結