分治+质因数分解——约数之和_北岭山脚鼠鼠的博客-CSDN博客
思路:
约数之和可以用公式求得,在用公式前需要先求得a^b的所有质因数以及出现次数。
公式里面的每一项都是一个等比数列,可以使用等比数列求和公式求得
为(p1 ^ ( B * a1 + 1 ) - 1 )/(p1 - 1 ),在学习了乘法逆元后,对于这种需要取模含分母运算的可以使用逆元的乘法来代替除法,分子直接使用快速幂,分母部分则是用乘(p1-1)的逆元代替除
(p1-1).
特殊的,当p-1是9901的倍数时,此时乘法逆元不存在,但是有p%9901=1.
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>PII;
const int N=1e6+10,mod=9901;
int primes[N],cnt[N];
int idx;
ll ans;
bool st[N];
void get_primes(int n)
{
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
{
primes[++idx]=i;
cnt[idx]=0;
while(n%i==0) n/=i,cnt[idx]++;
}
}
if(n>1) primes[++idx]=n,cnt[idx]=1;
}
ll qmi(ll a, ll k,ll p)
{
ll res=1;
while(k)
{
if(k&1) res=res*a%p;
k>>=1;
a=a*a%p;
}
return res;
}
int main()
{
ll a,b;
ans=1;
cin>>a>>b;
get_primes(a);
for(int i=1;i<=idx;i++)
{
if((primes[i]-1)%mod==0)
{
ans=((ll)b*cnt[i]+1)%mod*ans%mod;
continue;
}
ll x=qmi(primes[i],(ll)b*cnt[i]+1,mod);
x=(x-1+mod)%mod;
int y=primes[i]-1;
y=qmi(y,mod-2,mod);
ans=ans*x%mod*y%mod;
}
if(a!=0)
cout<<ans<<endl;
else
cout<<0<<endl;
return 0;
}