好像这题并不是组合数学啊……只是一个套公式的题目罢了。
一个正整数
n
有素因子分解
1.n的因子和=pa1+11−1p1−1∗pa2+12−1p2−1∗…∗pam+1m−1pm−1=∏i=1mpai+1i−1pi−1
2.n的因子个数=(a1+1)∗(a2+1)∗…∗(am+1)=∏i=1m(ai+1)
然后这题就变成了直接套第一条定理的水题,直接对于每个素因子快速幂求贡献即可。
然而这题给出的模数9901是一个质数,可能被给出的 n <script type="math/tex" id="MathJax-Element-5">n</script>包含,需要特判一下。
p.s.这题在poj上也有,题目要为1845,只是因为poj最近在维护所以不能交就去洛谷了。
附上AC代码:
#include <cstdio>
using namespace std;
typedef long long ll;
const int mod=9901;
ll a,b,c,ans;
inline ll ksm(ll x,ll y){
ll sum=1;
while (y){
if (y&1) sum=sum*x%mod;
x=x*x%mod,y>>=1;
}
return sum;
}
int main(void){
scanf("%d%d",&a,&b),ans=1;
for (int i=2; i*i<=a; ++i)
if (a%i==0){
c=0;while (a%i==0) a/=i,++c;
if (i==9901) continue;
ans=ans*(ksm(i,c*b+1)-1)%mod*ksm(i-1,mod-2)%mod;
}
if (a>1&&a!=9901) ans=ans*(ksm(a,b+1)-1)%mod*ksm(a-1,mod-2)%mod;
printf("%lld",ans);
return 0;
}