好像这题并不是组合数学啊……只是一个套公式的题目罢了。
一个正整数
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 包含,需要特判一下。
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;
}

本文介绍了一种利用正整数的素因子分解来高效计算其因子和的方法,并提供了一个具体的C++实现示例。通过应用数学公式和快速幂运算,可以解决在特定模数下计算因子和的问题。

1499

被折叠的 条评论
为什么被折叠?



