题解:P12388 Easy Equation
考虑
发现
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+5;
int n,c[N],ans;
char cnt[N<<1];//char 是为了卡常,时间可以卡到原来的 1/2
signed main(){
// freopen("1.in","r",stdin);
// freopen(".out","w",stdout);
cin>>n;
for(int i=1;i<=(n<<1);i++) cnt[i]=cnt[i-(i&-i)]+1;
for(int i=1;i<=25;i++)
for(int j=i;j<=25;j++)
if(__gcd(i,j)==1){
int k=max(i,j);
for(int d=k,t=i+j;d<=n;d+=k,t+=i+j)
if(cnt[t]==k) c[d]+=1+(i!=j);//i=j 只能算一次
}
for(int i=1;i<=n;i++) c[i]+=c[i-1],ans^=c[i];
cout<<ans<<'\n';
return 0;
}/*
*/