zoukankan      html  css  js  c++  java
  • 数学--数论--广义欧拉降幂(模板)

    未使用欧拉筛:

    适用于较少次数计算的欧拉降幂。

    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    ll a,m,b;
    
    inline ll read(ll m){
        register ll x=0,f=0;char ch=getchar();
        while(!isdigit(ch)) ch=getchar();
        while(isdigit(ch)){
            x=x*10+ch-'0';
            if(x>=m) f=1;
            x%=m;ch=getchar();
        }
        return x+(f==1?m:0);
    }
    
    ll phi(ll n){
        ll ans=n,m=sqrt(n);
        for(ll i=2;i<=m;i++){
            if(n%i==0){
                ans=ans/i*(i-1);
                while(n%i==0) n/=i; 
            }
        }
        if(n>1) ans=ans/n*(n-1);
        return ans;
    }
    
    ll fast_pow(ll a,ll b,ll p){
        ll ret=1;
        for(;b;b>>=1,a=a*a%p)
            if(b&1) ret=ret*a%p;
        return ret;
    }
    
    int main()
    {
        scanf("%lld%lld",&a,&m);
        b=read(phi(m));
        printf("%lld
    ",fast_pow(a,b,m));
        return 0;
    }
    

    使用线性筛优化的,因为数组限制不能开太大,所以MOD须小于1e8

    #include <bits/stdc++.h>
    #define ll long long
    #define maxn 10000000 
    using namespace std;
    bool ok[maxn];
    int prime[maxn],phi[maxn],cnt;
    ll a,m,b;
    void sieve()
    { 
            phi[1]=1;
    	for(ll i=2;i<maxn;++i)
    	{
    		if(!ok[i])
    		{
    			prime[cnt++]=i;
    			phi[i]=i-1;
    		}
    		for(int j=0;j<cnt;++j)
    		{
    			if(i*prime[j]>=maxn)break;
    			ok[i*prime[j]]=1;
    			if(i%prime[j]==0)
    			{
    				phi[i*prime[j]]=phi[i]*prime[j];//prime[j]是i的因子 prime[j]的素因子项包含在i的素因子项里
    				break; 
    			}
    			else phi[i*prime[j]]=phi[i]*(prime[j]-1);//prime[j]与i互质 phi[i*prime[j]=phi[i]*phi[prime[j]]
    		}
    	}
    }
    inline ll read(ll m){
        register ll x=0,f=0;char ch=getchar();
        while(!isdigit(ch)) ch=getchar();
        while(isdigit(ch)){
            x=x*10+ch-'0';
            if(x>=m) f=1;
            x%=m;ch=getchar();
        }
        return x+(f==1?m:0);
    }
    
    ll fast_pow(ll a,ll b,ll p){
        ll ret=1;
        for(;b;b>>=1,a=a*a%p)
            if(b&1) ret=ret*a%p;
        return ret;
    }
    
    int main()
    {
        sieve();
        scanf("%lld%lld",&a,&m);
        b=read(phi[m]);
        printf("%lld
    ",fast_pow(a,b,m));
        return 0;
    }
    
  • 相关阅读:
    灾后重建
    ZYN砍树
    聪聪可可
    GirlCat
    图表控件== 百度 echarts的入门学习
    图表控件的学习===》hightChart 和 Chartjs的使用
    拆分订单===初
    net 的单元测试 初学
    vue js 用nodejs的依赖包 --2016-08-23
    后台框架--HUI 的学习跟使用1
  • 原文地址:https://www.cnblogs.com/lunatic-talent/p/12798387.html
Copyright © 2011-2022 走看看