链接: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
好菜呀,连积性函数都没看出来,被初中生高中生吊打
#include<bits/stdc++.h>
using namespace std;
const long long mod=1e9+7;
long long qpow(long long a,long long n)
{
long long ans=1;
while(n)
{
if(n&1)
ans=ans*a%mod;
a=a*a%mod;
n>>=1;
}
return ans;
}
const long long maxn=13000010;
long long num[maxn];
long long n;
vector<long long >prime;
void init()
{
memset(num,-1,sizeof(num));
num[1]=1;
for(long long i=2; i<maxn; i++)
{
if(num[i]==-1)
{
num[i]=qpow(i,n);
prime.push_back(i);
}
for(int j=0; j<prime.size()&&prime[j]*i<maxn; j++)
{
num[prime[j]*i]=num[prime[j]]*num[i]%mod;
if(i%prime[j]==0)
break;
}
}
}
int main()
{
cin>>n;
init();
long long ans=0;
for(int i=1; i<=n; i++)
{
ans^=num[i];
}
cout<<ans;
return 0;
}