AcWing 97. 约数之和
原题链接
中等
作者:
RAbbit
,
2021-04-30 19:37:53
,
所有人可见
,
阅读 337
#include<iostream>
#include<unordered_map>
using namespace std;
//求等比数列前n项和
//sum(p,k)=p^0+p^1+....+p^k
//当k为奇数时可以划分为:(p^0+p^1+....+p^k/2)+(p^(k/2+1)+p^(k/2+2)+....+p^k),将p^k/2+1提出来.
// =(p^0+p^1+....+p^k/2)+p^k/2(p^1+p^2+...p^k/2)=(1+p^k/2+1)*sum(p,k/2);
//奇数项可以套公式
//当k为偶数时想办法转化为奇数求解.sum(p,k)=(p^0+p^1+...+p^k)=p*(p^0+p^1+....+p^k-1)+1=p*sum(p,k-1)+1;
const int mod = 9901;
unordered_map<int,int>prime;
int qmi(int a,int b)
{
a%=mod;
int t = 1;
while(b)
{
if(b&1)t=t*a%mod;
b>>=1;
a=a*a%mod;
}
return t;
}
int sum(int p,int k)
{
if(k==0)return 1;
if(k%2==0)//偶数
{
return (p%mod*sum(p,k-1)+1)%mod;
}
else return (1+qmi(p,k/2+1))*sum(p,k/2)%mod;
}
void divide (int n)
{
for(int i=2;i<=n/i;i++)
{
while(n%i==0)
{
n/=i;
prime[i]++;
}
}
if(n>1)prime[n]++;
}
int main()
{
int a,b;
cin>>a>>b;
int res=1;
divide(a);
for(auto x:prime)
{
int p=x.first,k=x.second;
res=res*sum(p,k*b)%mod;
}
if(!a)res=0;
cout<<res<<endl;
return 0;
}