华华给月月出题 题解(积性函数+欧拉筛+快速幂)

题目链接

题目大意

题目思路

前缀知识

积性函数指对于所有互质的整数a和b有性质\(f(ab)=f(a)f(b)\)的数论函数。

直接快速幂会nlogn会t

那么显然就要优化一下

\(f(x)=x^n\)

显然\(f(a*b)=f(a)*f(b)\)

\(f(x)\)为完全积性函数则求出所有质因子的\(f(x)\),然后欧拉筛即可

代码

#include<bits/stdc++.h>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
const int maxn=1e7+3e6+5,inf=0x3f3f3f3f,mod=1e9+7;
const int eps=1e-6;
int n;
ll f[maxn],ans=1;
int prime[maxn],cnt;
bool isprime[maxn];
ll qpow(ll a,ll b){
    ll ans=1,base=a;
    while(b){
        if(b&1){
            ans=ans*base%mod;
        }
        base=base*base%mod;
        b=b>>1;
    }
    return ans;
}
void getprime(int n){
    for(ll i=2;i<=n;i++){//开ll因为后面要计算i*prime[j]
        if(!isprime[i]){
            prime[++cnt]=i;
            f[i]=qpow(i,n);
        }
        for(int j=1;j<=cnt&&i*prime[j]<=n;j++){
            f[i*prime[j]]=f[i]*f[prime[j]]%mod;
            isprime[i*prime[j]]=1;
            if(i%prime[j]==0) break;
        }
        ans^=f[i];
    }
}
signed main(){
    cin>>n;
    getprime(n);
    cout<<ans<<endl;
    return 0;
}

不摆烂了,写题
原文地址:https://www.cnblogs.com/hunxuewangzi/p/14354492.html