題意
有堆石子,第堆石子每次可以取的數量在間,問先手是否必勝。
分析
這顯然是一個遊戲的變種。
我們首先通過函數分析。一般這種由多個小狀態(每堆石子)組成的局面,都可以先單獨分析出每個小狀態的函數值,然後異或起來,最後得到整體局面的函數值。(抄一波博弈論課件)
那麼如果我們把每一堆石子單獨考慮,那麼函數就非常顯然了,如果第堆石子數量爲,那麼顯然它的函數爲。因爲每一個狀態都可以轉移到,所以會產生長度爲的循環節~~(實在不行手動打表即可)~~。
於是只要求出每堆的函數,最後異或起來即可判斷是否必勝:異或和不爲則必勝,否則必敗。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n;
ll a[10005];
int main()
{
int t;
cin >> t;
while(t--){
cin >> n;
for(int i = 1; i <= n; i++){
scanf("%lld", &a[i]);
}
ll x, ans = 0;
for(int i = 1; i <= n; i++){
scanf("%lld", &x);
ans ^= (a[i]%(x+1));
}
if(ans) puts("Amit");
else puts("Mishra");
}
return 0;
}