巴什博弈
思路
N個(gè)石子,每次取1 - M個(gè),取完的勝。
當(dāng)剩余的石子為1 + M 后手勝,只需要判斷N是否為(1 + M)的倍數(shù)。
練習(xí)
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的時(shí)候必輸,任何數(shù)都可以通過(guò)減0,減1,減2變成3的倍數(shù),所以誰(shuí)面臨3的倍數(shù)誰(shuí)就輸。
#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, 這樣第一個(gè)人寫X,第二個(gè)人總可以寫1 + M - X,到最后第一個(gè)人無(wú)論寫多少都會(huì)>= N,所以 N = (1 + M) * K + 1 為奇異局勢(shì)。
#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位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)