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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值