1. 程式人生 > >牛客練習賽29 F算式子

牛客練習賽29 F算式子

names space can i++ namespace using std png mes

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

牛客練習賽29 F算式子