multi-sg
每次操作或者取走1到a[i]个石子,或者选择把其中一堆分成x堆
先打表找规律(防超时),再计算总游戏的sg值
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cmath>
#include<set>
#include<string>
#include<cstring>
#define ll long long
using namespace std;
int sg[200];
int get_sg(int x){
if(x%8==0)return x-1;
if(x%8==7)return x+1;
return x;
}
int main(){
int t,n,a;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
int ans=0;
for(int i=1;i<=n;i++){
scanf("%d",&a);
ans^=get_sg(a);
}
if(ans){
printf("First player wins.\n");
}
else printf("Second player wins.\n");
}
}
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cmath>
#include<set>
#include<string>
#include<cstring>
#define ll long long
using namespace std;
ll get_sg(ll x){
if(x%4==3)return x+1;
if(x%4==0)return x-1;
return x;
}
int main(){
int t,n;
ll a;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
ll ans=0;
for(int i=1;i<=n;i++){
scanf("%lld",&a);
ans^=get_sg(a);
}
if(ans){
printf("Alice\n");
}
else printf("Bob\n");
}
}