【题意】:给出一个当前值q(q <= 10^13),两个人轮流写出一个当前值的非平凡因子来取代当前值,谁不能写谁胜出。一个数的非平凡因子是指除1和本身之外的因子。两个人都采取最优决策,问最后谁胜出。
【题解】:博弈,直接记忆化搜索即可,只要搜到第一个必败态就可以跳出。
利用map来处理可以把代码写得很短。
【代码】:
1 #include "iostream"
2 #include "cstdio"
3 #include "cstring"
4 #include "algorithm"
5 #include "vector"
6 #include "queue"
7 #include "cmath"
8 #include "string"
9 #include "cctype"
10 #include "map"
11 #include "iomanip"
12 using namespace std;
13 #define pb push_back
14 #define lc(x) (x << 1)
15 #define rc(x) (x << 1 | 1)
16 #define lowbit(x) (x & (-x))
17 #define ll long long
18 #define MAX 10000000
19 map<ll, bool> win;
20 map<ll, ll> ans;
21 ll q;
22
23 bool dfs(ll x) {
24 if(win.find(x) == win.end()) {
25 bool isprime = true, WIN = false;
26 ans[x] = 0;
27 for(ll i = 2; i * i <= x && !WIN; i++) {
28 if(x % i == 0) {
29 isprime = false;
30 if(!dfs(i)) WIN = true, ans[x] = i;
31 if(WIN) break;
32 if(!dfs(x / i)) WIN = true, ans[x] = x / i;
33 }
34 }
35 win[x] = WIN || isprime;
36 }
37 return win[x];
38 }
39
40 int main() {
41 ans.clear(), win.clear();
42 while(cin >> q) {
43 if(dfs(q)) cout << 1 << endl << ans[q] << endl;
44 else cout << 2 << endl;
45 }
46 return 0;
47 }
48