zoukankan      html  css  js  c++  java
  • Sumdiv|同余|约数|拓展欧几里得算法

    呕,我吐了。img

    Sumdiv|同余|约数|拓展欧几里得算法

    Problem

    [求A^{B}的所有约数之和 mod 9901left(1leqslant A,B leqslant 5*10^{7} ight) ]

    分析

    约数个数定理部分

    定理内容:

    对于一个大于1的正整数n可以分解质因数:

    img

    则n的正约数个数为:

    img

    定理证明:

    约数定义可得,

    [p_k^{a_k}的约数有left(a_k+1 ight)个。 ]

    故根据乘法原理:

    n的约数个数就是:

    img


    约数和定理部分

    定理内容:

    img

    定理证明:

    约数个数定理乘法原理可证。


    等比数列部分

    等比数列通项公式、求和公式

    formula

    formula


    题目分析

    把A分解质因数

    [A=p_1^{c_1}cdot p_2^{c_2}cdot p_3^{c_3}cdot ... cdot p_n^{c_n} ]

    根据约数和定理

    [S=prod_{i=1}^{i=n}left(sum_{j=1}^{j=Bcdot C_n} ight) ]

    每一项都是一个等比数列

    根据等比数列求和公式:

    [S=1+p_k+p_k^2+...+p_k^{Bcdot C_1}=frac{p_k^{Bcdot c_k+1}-1}{p_k-1} ]


    扩展欧几里得算法部分

    可以先用快速幂计算分子

    [left(P_k^{Bcdot c_1+1}-1 ight)mod 9901 ]

    和分母

    [left(p_k-1 ight)mod 9901 ]

    因为9901是质数,只要pk-1不是6601的倍数,就只需pk-1的乘法逆元inv,用乘inv代替除以(pk-1),直接计算出等比数列求和公式的结果。

    特别地,若pk-1是9901的倍数,此时乘法逆元不存在,但pk mod 9901=1,所以

    [1+p_k+p_k^2+...+p_k^{Bcdot c_1}equiv1+1+1^2+...+1^{Bcdot c_1}equiv Bcdot c_1+1left(mod 9901 ight) ]

    Code

    #include <cstdio>
    #include <iostream>
    #define ll long long
    using namespace std;
    const ll mod=9901;
    ll a,b,m,ans=1;
    ll p[20],c[20];
    void divide(ll n){//分解质因数 
    	m=0;
    	for(int i=2;i*i<=n;i++)
    		if(n%i==0){
    			p[++m]=i,c[m]=0;
    			while(n%i==0) n/=i,c[m]++;
    		}
    	if(n>1) p[++m]=n,c[m]=1;
    }
    ll power(ll a,ll b){
    	ll c=1;
    	while(b){
    		if(b&1) c=(ll)c*a%mod;
    		a=(ll)a*a%mod;
    		b>>=1;
    	}
    	return c;
    }
    int main(){
    	while(~scanf("%lld%lld",&a,&b)){
    		ans=1;
    		divide(a);
    		for(ll i=1;i<=m;i++){
    			if((p[i]-1)%mod==0){//没有逆元,特判 
    				ans=(b*c[i]+1)%mod*ans%mod;
    				continue;
    			}
    			ll x=power(p[i],(ll)b*c[i]+1);//分子
    			x=(x-1+mod)%mod;
    			ll y=p[i]-1;//分母
    			y=power(y,mod-2);//根据费马小定理
    			ans=(ll)ans*x%mod*y%mod; 
    		}
    		printf("%lld
    ",ans);
    	}
    	return 0;
    }
    
  • 相关阅读:
    Python语法解析器PLY——lex and yacc in Python
    spider-lang :爬虫语言,专为网络爬虫设计
    使用ANTLR做一个简单的Python SQL语法解析器
    使用Antlr实现简单的DSL
    Wrights Notes
    20个人团建能干些什么?
    zz
    贾跃亭反思乐视节奏过快_公司频道_财新网
    西湖人才网 职称考评
    安能物流
  • 原文地址:https://www.cnblogs.com/saitoasuka/p/10344045.html
Copyright © 2011-2022 走看看