#积性函数 #线性筛 #快速幂

题意

  • 给定n,求解
  • n<=1.3e7

思路

  • 满足积性函数
  • 需要找到n以下每个数的n次方,可以用筛法,质数的用快速幂计算,合数的用质数递推
  • 因为空间限制,无法记录每个数的最小质因子,但其实可以直接暴力的乘上每一个质因子,同时开一个bool的vis数组保证每一个数只计算一遍

代码

#include<iostream>
using namespace std;
using ll=long long ;
const int N=13e6+10;
const int p=1e9+7;
ll qpow(ll a,ll b){
    a%=p;
    ll res=1;
    while(b){
      if(b&1) res=res*a%p;
      a=a*a%p;
      b>>=1;
    }
    return res;
}
int prime[N];
bool v[N];
ll res[N];

int ans=1;
int cnt=0;

int main(){
    int n;
    cin >> n;
    for(int i=2;i<=n;i++){
        if(v[i]==0){
            prime[cnt++]=i;
            v[i]=1;
            res[i]=qpow(i,n);
        }
        for(int j=0;j<cnt;j++){
            if(prime[j]*i>n) break;
            v[i*prime[j]]=1;
            res[i*prime[j]]=res[i]*res[prime[j]]%p;
        }
        ans^=res[i];
    }
    cout << ans << endl;
    return 0;
}