HDU-1517 A Multiplication Game
阿新 • • 發佈:2022-05-18
A Multiplication Game
巴什博奕
這題的控制範圍在於 x * 18
可以觀察:
-
必敗態 \([n, +\infty]\)
-
必勝態
[n / 9, n)
-
必敗態
[n / 9 / 2, n / 9)
-
必勝態
[n / 9 / 2 / 9, n / 9 / 2)
可發現必敗態是 [n / (k * 18), 2 * n / (k * 18))
因此我們只要考慮將 n 一直除到 18 以下,就可以判斷第一步,先手能否將狀態轉換為必敗態,也就是判斷此時的 n 與 9 的關係
#include <iostream> using namespace std; int main() { double n; while (cin >> n) { while (n > 18) n /= 18; if (n <= 9) cout << "Stan wins." << endl; else cout << "Ollie wins." << endl; } return 0; }
通過這道題,我還發現我總是會以一種很奇怪的方式水過一道題
例如直接搜尋sg函式
#include <iostream> #include <cstdio> #include <algorithm> #include <map> using namespace std; typedef long long ll; const int maxn = 1e6 + 10; map<ll, int>sg; ll n; // 1 必輸 2 必勝 int dps(ll x) { if(x >= n) return 1; if(sg[x]) return sg[x]; int f = 1; for(int i=9; i>=2 && f == 1; i--) if(dps(x * i) == 1) f = 2; return sg[x] = f; } int main() { while(cin >> n) { sg.clear(); int ans = dps(1); if(ans == 1) cout << "Ollie wins." << endl; else cout << "Stan wins." << endl; } return 0; }