我的思路:记录下每个数理论最多操作次数,记录为一个数组,操作转化为在这个数组里选一个数减去任意。 必胜策略是永远使这个数组的和为偶数,直到只剩0和1。 代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,a[200005],b[200005],sum=0,op=1;
bool cmp(int x,int y)
{
return x>y;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]==1)
{
b[i]=0;
continue;
}
int m=a[i],cnt=0;
for(int j=2;j*j<=a[i];j++)
{
while(m%j==0)
{
cnt++;
m=m/j;
}
}
if(m>1)cnt++;
b[i]=cnt;
sum+=b[i];
}
sort(b+1,b+n+1,cmp);
for(int i=1;i<=n;i++)
{
//cout<<b[i]<<" ";
if(sum%2==0)//去一个偶数
{
if(b[i]<=1)op=3-op;
sum-=b[i]/2*2;
b[i]-=b[i]/2*2;
}
else//去一个奇数
{
if(b[i]/2*2+1<=b[i])
{
if(b[i]<=0)op=3-op;
sum-=b[i]/2*2+1;
b[i]-=b[i]/2*2+1;
}
else
{
if(b[i]<=0)op=3-op;
sum-=b[i]/2*2-1;
b[i]-=b[i]/2*2-1;
}
}
//cout<<b[i]<<"\n";
op=3-op;//换人
}
if(op==1)cout<<"Bruno";//2会赢
if(op==2)cout<<"Anna";//1会赢
return 0;
}