一.题目
n个正整数(1\(\le\)a[i]\(\le\)m),对于[1,m]内每个x计算下式,最后求异或和。
二.思路
分成 \(\frac{a[i]}{x}\) \(\frac{x}{a[i]}\) 两部分计算,两个互为逆过程,意会一下就行。
三.代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e6+5;
ll a[N],s[N];
int main(){
int n,m,t;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&t),a[t]++;
for(int i=1;i<=m;i++){
for(int j=i;j<=m;j+=i){
s[j]+=a[i];
}
}
for(int i=1;i<=m;i++) s[i]+=s[i-1];
for(int i=m;i>=1;i--) a[i]+=a[i+1];
ll ans=0;
for(int i=1;i<=m;i++){
for(int j=i;j<=m;j+=i){
s[i]+=a[j];
}
ans^=s[i];
}
printf("%lld\n",ans);
return 0;
}