思路:
如果数都出现了偶数次一定是后手必胜,所以就前缀和处理处个数,然后判断
c o d e code code
#include<iostream>
#include<cstdio>
using namespace std;
long long n, a[1000010], maxn, cnt[1010000], sum[1001000];
long long b[1001000], ans;
int main()
{
scanf("%lld", &n);
for(long long i=1; i<=n; i++)
scanf("%lld", &a[i]), cnt[a[i]]++, maxn=max(maxn, a[i]);
for(long long i=1; i<=maxn; i++)
sum[i]=sum[i-1]+cnt[i];
for(long long i=1; i<=maxn; i++)
{
long long tot=maxn/i;
for(long long j=1; j<=tot; j++) b[j]=sum[min((j+1)*i-1, maxn)]-sum[i*j-1];
long long bj=0;
for(long long j=1; j<=tot; j++)
bj+=b[j]&1;
if(bj==0||bj>2)
continue;
if(bj==1)
{
if(b[1]&1)
ans+=b[1];
}
if(bj==2)
{
for(long long j=1; j<=tot; j++)
if((b[j]&1)&&(b[j-1]&1))
ans+=b[j];
}
}
printf("%lld", ans);
return 0;
}