首先,对 b=1 的情况进行考虑:A 的约数,可以看成对其质因数分解(假设为m)后,从中取 n 个质因数(每个质因数取的个数不能超过A中有的)相乘。于是这道题我们也是一样的做法。
的约数就是从A的m个质因数里,取n个(其中,每个质因数取的个数,不超过 A中有的和B的乘积)
根据乘法分配律,可以得到:
1.对 A 质因数分解(试除法+筛法)
2.分治以某一个质因数p为公比,B*ci为项数求前 n 项和
3.注意配合快速幂
#include <cstdio>
#include <cmath>
#include <iostream>
using namespace std;
const int mod=9901;
int m;
int pp[500],cc[500];
void divide(int n)
{
m=0;
for(int i=2;i<=sqrt(n);i++)
{
if(n%i==0)
{
pp[++m]=i;
cc[m]=0;
}
while(n%i==0)
{
n/=i;
cc[m]++;
}
}
if(n>1)
pp[++m]=n,cc[m]=1;
}
long long int qpow(long long int a,long long int b)
{
long long int r=1,base= a;
while(b)
{
if(b&1)
r=(r*base)%mod;
base=(base*base)%mod;
b>>=1;
}
return r;
}
long long int sum(long long int p,long long int c)
{
if(c==0)
return 1;
if(c==1)
return p%mod+1;
if(c&1)
return ((1+qpow(p,(c+1)/2))*sum(p,(c-1)/2))%mod;
else
return ((1+qpow(p,c/2))*sum(p,c/2-1)+qpow(p,c))%mod;
}
int main()
{
int a,b;
cin>>a>>b;
if(a==1)
{
cout<<1<<endl;
return 0;
}
divide(a);
int res=1;
for(int i=1;i<=m;i++)
{
res=(res * (sum(pp[i],cc[i]*b)%mod))%mod;
}
cout<<res<<endl;
return 0;
}