牛客 华华给月月出题 (积性函数+线性筛)
N<=13000000;
解析
这是一个积性函数,满足f(a,b)=f(a)*f(b);
也就是说我们只要把所有质数的N次方算出来即可
合数可以通过质数得出
其他常见的积性函数还有
1.莫比乌斯函数
2.欧拉函数
3.求约数和
4.求约数的个数
代码
import java.io.BufferedReader;
import java.io.*;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class Main {
static int N=13000000+10;
static int mod =1000000007;
static long []ar =new long [N];
static int []vis=new int [N];
static int []prm=new int [N];
static long pow (long b,long a) {
long ans =1;
while(a>0) {
if((a&1)==1) {
ans=ans*b%mod;
}
b=b*b%mod;
a>>=1;
}
return ans;
}
public static void main(String []args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String str=br.readLine();
int x =Integer.parseInt(str);
long ans=1;
for(int i=2;i<=x;i++) {
if(vis[i]==0) {
prm[++vis[0]]=i;
ar[i]=pow(i,x);
}
ans^=ar[i];
for(int j=1;j<=vis[0]&&i*prm[j]<=x;j++) {
vis[(i*prm[j])]=1;
ar[(i*prm[j])]=ar[i]*ar[prm[j]]%mod;
if(i%prm[j]==0) break;
}
}
System.out.println(ans);
}
}