牛客练习赛29 F算式子

一.题目
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;
}

猜你喜欢

转载自www.cnblogs.com/Advancingxq/p/9822797.html