题目描述
华华刚刚帮月月完成了作业。为了展示自己的学习水平之高超,华华还给月月出了一道类似的题:
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 1≤N≤1.3∗107
看完题目忍不住要给数学大佬们献上膝盖
题解:
设
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(x∗y)=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<iostream>
#include<cstdio>
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;
}