给定 ,求 的所有因子的和对 取模的值,即求:
记 ,其中 是质数,。
那么,。由定理,答案 。
直接算铁定不行,但是由费马小定理得,是质数 。由题意,,于是我们可以算出 。然后,因为后面的项一定与前面的某一项相等,于是我们可以令这个数列 位为一个循环,于是我们可以直接由 得到所有循环的总和。对于后面剩余的项,我们可以暴力得到。
举个例子,比如 ,我们可以求出 ,然后答案 。
时间复杂度没用等比数列优,但是需要的知识点少,比较好理解(至少个人认为如此)。
const int mod=9901;
int calc(int x,long long t){
int ret=1,ans=0;
if (x==mod) return 1;
else if (t<mod){
for(int i=0;i<=t;i++){
ans=(ans+ret)%mod;
ret=(1ll*ret*x)%mod;
}
}
else{
for(int i=0;i<=mod-2;i++){
ans=(ans+ret)%mod;
ret=(1ll*ret*x)%mod;
}
ans=(1ll*ans*((t+1)/(mod-1)))%mod;
for(int i=1;i<=(t+1)%(mod-1);i++){
ans=(ans+ret)%mod;
ret=(1ll*ret*x)%mod;
}
}
return ans;
}
int ans=1,a,b,n;
int main(){
scanf("%d%d",&a,&b);n=a;
for(int i=2;1ll*i*i<=n;i++)
if (n%i==0){
register int ret=0;
while (n%i==0){
n/=i;ret++;
}
ans=(1ll*ans*calc(i,1ll*ret*b))%mod;
}
if (n>1) ans=(1ll*ans*calc(n,b))%mod;
printf("%d",(ans+mod)%mod);
return 0;
}
来源:CSDN
作者:ZHUYINGYE_123456
链接:https://blog.csdn.net/ZHUYINGYE_123456/article/details/104859275