链接: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;
}