【洛谷】1593 因子和 组合数学

22 篇文章 0 订阅
5 篇文章 0 订阅

题目传送门

好像这题并不是组合数学啊……只是一个套公式的题目罢了。

一个正整数 n 有素因子分解=pa11pa22pamm,则有以下两个定理:

1.n=pa1+111p11pa2+121p21pam+1m1pm1=i=1mpai+1i1pi1

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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值