牛客 华华给月月出题 (积性函数+线性筛)

在这里插入图片描述
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);
	}
}


posted @ 2019-03-17 12:41  ffgcc  阅读(240)  评论(0编辑  收藏  举报