实验吧 大数模运算

实验吧 大数模运算

题目链接:http://www.shiyanbar.com/ctf/1906

题目大意:求$12345^{12345}$的所有约数之和,并对其取模$9901$再输出。

唯一分解定理+生成函数

对于任意一个数$a$,由唯一分解定理得$a=\prod_{i=0}^k p_i^{c_i}$,

故由生成函数的定义可知,其约数之和为$S=\prod_{i=0}^k (\sum_{j=0}^{c_i} p_i^j)$.

而对于$a^n$,则有$a=\prod_{i=0}^k p_i^{n \times c_i}$.

故其约数之和为$S'=\prod_{i=0}^k (\sum_{j=0}^{n \times c_i} p_i^j)$.

由等比数列求和公式即可求得答案.

代码如下:

 1 #include <cstdio>
 2 #define N 10005
 3 using namespace std;
 4 typedef long long ll;
 5 ll a=12345,n=12345,m=9901,p[N],c[N],k,ans=1;
 6 ll minus(ll a,ll b){return (a-b+m)%m;}
 7 ll mul(ll a,ll b){return (a*b)%m;}
 8 ll powmod(ll a,ll n){
 9     ll r=1;
10     while(n){
11         if(n&1)r=mul(r,a);
12         a=mul(a,a);
13         n>>=1;
14     }return r;
15 }
16 int main(void){
17     for(int i=2;i*i<=a;++i)if(a%i==0){
18         while(a%i==0){
19             c[k]+=n;
20             a/=i;
21         }p[k++]=i;
22     }
23     if(m!=1){
24         c[k]+=n;
25         p[k++]=a;
26     }
27     for(int i=0;i<k;++i)
28         ans=mul(ans,mul(minus(powmod(p[i],c[i]+1),1),powmod(p[i]-1,m-2)));
29     printf("%lld\n",ans);
30 }

 

转载于:https://www.cnblogs.com/barrier/p/6731391.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值