链接:https://ac.nowcoder.com/acm/contest/392/C
来源:牛客网
题目描述
华华刚刚帮月月完成了作业。为了展示自己的学习水平之高超,华华还给月月出了一道类似的题:
Ans=⊕Ni=1(iNmod(109+7))Ans=⊕i=1N(iNmod(109+7))
⊕⊕符号表示异或和,详见样例解释。
虽然月月写了个程序暴力的算出了答案,但是为了确保自己的答案没有错,希望你写个程序帮她验证一下。
输入描述:
输入一个正整数N。
输出描述:
输出答案Ans。
示例1
输入
3
输出
18
说明
N=3时,13=113=1,23=823=8,33=2733=27,异或和为18。
示例2
输入
2005117
输出
863466972
备注:
1≤N≤1.3×107
官方题解:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int maxn = 1.3e7 + 5;
int prime[maxn], n;
ll sum[maxn];
bool v[maxn];
ll quickpow(ll x,ll y)
{
ll res = 1;
while(y){
if(y & 1) res = res*x%mod;
y >>= 1;
x = x*x%mod;
}
return res;
}
ll primes()
{
int m = 0;
for(int i = 2; i <= n; i++){
if(!v[i]){
prime[++m] = i;
v[i] = 1;
sum[i] = quickpow(i,n);
}
for(int j = 1; j <= m; j++){
if(i*prime[j] > n || i%prime[j] == 0) break;
v[i*prime[j]] = 1;
sum[i*prime[j]] = sum[i]*sum[prime[j]]%mod;
}
}
ll ans = 1;
for(int i = 2; i <= n; i++){
ans ^= sum[i];
}
return ans;
}
int main()
{
cin>>n;
printf("%lld\n",primes());
return 0;
}