小白练习赛12☞C.华华给月月出题

题目描述

华华刚刚帮月月完成了作业。为了展示自己的学习水平之高超,华华还给月月出了一道类似的题:
A n s = ⨁ i = 1 N ( i N m o d ( 1 0 9 + 7 ) ) Ans=\bigoplus_{i=1}^N(i^N mod (10^9+7)) Ans=i=1N(iNmod(109+7))
⨁ \bigoplus 符号表示异或和,详见样例解释。
虽然月月写了个程序暴力的算出了答案,但是为了确保自己的答案没有错,希望你写个程序帮她验证一下。

输入描述:

输入一个正整数N。

输出描述:

输出答案Ans。

note:

1 ≤ N ≤ 1.3 ∗ 1 0 7 1\leq N\leq 1.3*10^7 1N1.3107

看完题目忍不住要给数学大佬们献上膝盖
小白练习赛12☞C.华华给月月出题_第1张图片
题解:
F ( n ) = ⨁ i = 1 N ( f ( i ) ) , f ( x ) = x N m o d ( 1 0 9 + 7 ) F(n)=\bigoplus_{i=1}^N(f(i)), f(x)=x^Nmod(10^9+7) F(n)=i=1N(f(i)),f(x)=xNmod(109+7)
∵ f ( x ∗ y ) = f ( x ) ∗ f ( y ) \because f(x*y)=f(x)*f(y) f(xy)=f(x)f(y)
∴ f ( x ) 是 积 性 函 数 \therefore f(x)是积性函数 f(x)
所以可以预处理[1, N]的素数集的 f ( x ) f(x) f(x),而[1,N]非素数的 f ( x ) f(x) f(x)可以通过积性函数的性质得到。
code

#include
#include
using namespace std;
const int maxn = 1.3e7+10;
const long long mod = 1e9+7;
bool prime[maxn];
int w[maxn], cnt = 0;
long long f[maxn];
int n;
long long Pow(long long x, long long p){
	long long ans = 1;
	while(p){
		if(p & 1) ans = (ans*x)%mod;
		x = (x*x)%mod;
		p>>=1;
	}
	return ans;
}
void solve(){
	for(int i = 2; i <= n; i++){
		if(prime[i]) continue;
		f[i] = Pow(i, n);
		w[cnt++] = i;
		for(int j = i<<1; j <= n; j+=i){
			prime[j] = true;
		}
	}
	long long ans = 1;
	for(int i = 2; i <= n; i++){
		if(!prime[i]) ans^=f[i];
		else{
			int k = i;
			for(int j = 0; j < cnt; j++){
				if(i%w[j]==0){
					f[i] = (f[w[j]]*f[i/w[j]])%mod;
					break;	
				}
			}
			ans^=f[i];
		}
	}
	printf("%lld\n", ans);
}
int main(){
	scanf("%d", &n);
	solve();
	return 0;
} 

你可能感兴趣的:(牛客网,ACM,牛客网)