也许我应该下放一下我的懒惰标记了。
题面
题意:n≤1e5,a≤1e7,求
由于积性,对每个质数p求贡献。
φ(pe)=pe∗p−1p
,对于某个a,我们掏空它里面p的幂,得到贡献
∑ki=0φ(pi)=p−1p∗(−1+∑ki=0pi)+1
对于全部a的话,把
p−1p
拉出来,其他的乘起来就行了。
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <ctime>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
#define mmst(a, b) memset(a, b, sizeof(a))
#define mmcp(a, b) memcpy(a, b, sizeof(b))
typedef long long LL;
const int N=10010000,nn=10000000;
const LL mo=1e9+7;
int n;
int prime[N],u[N],k[N],num;
bool b[N];
LL tu,hy,a[N],ans=1;
LL cheng(LL aa,LL bb)
{
LL res=1;
for(;bb;bb>>=1,aa=aa*aa%mo)
if(bb&1)
res=res*aa%mo;
return res;
}
int main()
{
for(int i=2;i<=nn;i++)
{
if(!b[i])
{
prime[++num]=i;
a[i]=k[i]=1;
u[i]=i;
}
for(int j=1;j<=num&&prime[j]*i<=nn;j++)
{
b[i*prime[j]]=1;
u[i*prime[j]]=prime[j];
k[i*prime[j]]=1;
if(i%prime[j]==0)
{
k[i*prime[j]]=k[i]+1;
break;
}
}
}
cin>>n;
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
while(x!=1)
{
tu=1;
hy=1;
for(int j=1;j<=k[x];j++)
tu=tu*u[x]%mo,hy=(hy+tu)%mo;
a[u[x]]=(a[u[x]]*hy)%mo;
x/=tu;
}
}
for(int i=2;i<=nn;i++)
if(!b[i])
{
a[i]=(a[i]-1+mo)%mo;
a[i]=a[i]*(i-1)%mo;
a[i]=a[i]*cheng(i,mo-2)%mo;
a[i]=(a[i]+1)%mo;
ans=ans*a[i]%mo;
}
cout<<ans<<endl;
return 0;
}
为美好的数论先上祝福