poj1845 sumdiv (因数的和)

Posted ressed

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj1845 sumdiv (因数的和)相关的知识,希望对你有一定的参考价值。

首先分解质因数,$A^B=p_1^{m_1B}p_2^{m_2B}...p_n^{m_nB}$

然后的话,它的所有因数的和就是$prod{(1+p_i^1+p_i^2+...+p_i^n)}$

用一个等比数列求和公式,变成了$prod{frac{p_i^{m_iB+1}-1}{p_i-1}}$

但是要求逆元的话,它的模数很小,可能求不了

所以在算$p_i^{n+1}-1$的时候先模的是$mod*(p_i-1)$,然后直接除以$p_i-1$,一定能整除

最后再模一边mod就行了

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define pa pair<int,int>
 5 #define CLR(a,x) memset(a,x,sizeof(a))
 6 using namespace std;
 7 typedef long long ll;
 8 const int maxn=1e4,P=9901;
 9 
10 inline ll rd(){
11     ll x=0;char c=getchar();int neg=1;
12     while(c<0||c>9){if(c==-) neg=-1;c=getchar();}
13     while(c>=0&&c<=9) x=x*10+c-0,c=getchar();
14     return x*neg;
15 }
16 
17 ll p[maxn];
18 ll n[maxn],a,b;
19 
20 inline ll fmul(ll x,ll y,ll p){
21     ll re=0;
22     while(y){
23         if(y&1) re=(re+x)%p;
24         x=(x+x)%p,y>>=1; 
25     }return re;
26 }
27 
28 inline ll fpow(ll x,ll m,ll p){
29     ll re=1;
30     while(m){
31         if(m&1) re=fmul(re,x,p);
32         x=fmul(x,x,p),m>>=1; 
33     }return re;
34 }
35 
36 int main(){
37     int i,j=0,k;
38     a=rd(),b=rd();
39     for(i=2;i*i<=a;i++){
40         if(a%i==0) p[++j]=i;
41         while(a%i==0) n[j]++,a/=i;
42     }if(a!=1) p[++j]=a,n[j]=1;
43     ll ans=1;
44     for(i=1;i<=j;i++){
45         ll x=fpow(p[i],n[i]*b+1,(p[i]-1)*P)+(p[i]-1)*P-1;
46         ans=ans*(x/(p[i]-1)%P)%P;
47     }
48     printf("%d
",(ans+P)%P);
49     return 0;
50 }

 

以上是关于poj1845 sumdiv (因数的和)的主要内容,如果未能解决你的问题,请参考以下文章

POJ 1845 Sumdiv#质因数分解+二分

POJ1845 Sumdiv(求所有因数和+矩阵快速幂)

POJ 1845Sumdiv——数论 质因数 + 分治 + 快速幂

POJ 1845-Sumdiv 数论 +快速幂&&筛素&&分解质因数&&求因数之和的模板

POJ - 1845 Sumdiv(分治)

poj1845 Sumdiv