题解说的好玄乎,其实就是分配律 alt 该题数据范围过大,直接快速幂会超时,所以我们预处理质数的快速幂,利用线性筛和算术基本定理快速求出某个数的i^N

#include <bits/stdc++.h>

using namespace std;

using ll=long long;
const int N=2e7+10,mod=1e9+7;
ll f[N],p[N],cnt;
bool st[N];
ll n,ans;

ll qmi(ll a,ll b){
    ll res=1;
    while(b){
        if(b&1) res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}//快速幂模板

void init(){
    f[1]=1;//初始化f[1]=1,
    for(int i=2;i<=n;i++){
        if(!st[i]){
            p[cnt++]=i;
            f[i]=qmi(i,n);//求出质数的N次方
        }
        for(int j=0;p[j]<=n/i;j++){
            st[i*p[j]]=1;
            f[i*p[j]]=f[i]*f[p[j]]%mod;
            //f[i]相当于小于p[j]的所有质数的N次方的乘积
            if(i%p[j]==0) break;
        }
    }
}//线性筛模板

int main(){
    cin >> n;
    init();
    for(int i=1;i<=n;i++) ans^=f[i];
    cout << ans << endl;
}