zoukankan      html  css  js  c++  java
  • 欧拉降幂

    当求a的b次幂%p时,如果在求b的时候被迫要取余的话,那么就要用到欧拉降幂

     

     就像这个是的就是在就fn的时候不得不取余,因为fn是指数上的如果直接取余的话肯定会wa,所以要用到欧拉降幂,就是在求fn的时候mod(1e9+7-1)

    #include<iostream>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const int mod=1e9+7;
    const int maxn=1e6+100;
    ll f[maxn];
    ll a,b,m,n;
    ll qpow(ll a,ll b){
        ll ans=1;
        a%=mod;
        while(b){
            if(b&1){
                ans=(ans*a)%mod;
            }
            a=(a*a)%mod;
            b/=2; 
        }
        return ans;
    }
    void inint(){
        f[1]=1;
        f[2]=1;
        for(int i=3;i<=110000;i++){
            f[i]=(a*f[i-1]+b*f[i-2])%(mod-1); 
        }    
    }
    int main(){
        cin>>a>>b>>m>>n;
        inint();
        ll ans=qpow(m,f[n])%mod;
        cout<<ans<<endl;
    }

    Description

     

    Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=1000000000,1<=B<=10^1000000).

    Input

    There are multiply testcases. Each testcase, there is one line contains three integers A, B and C, separated by a single space.

    Output

    For each testcase, output an integer, denotes the result of A^B mod C.

    Sample Input

    3 2 4
    2 10 1000
    

    Sample Output

    1
    24
    

    Hint

     

    Source

    FZU 2009 Summer Training IV--Number Theory
     
    题意:A^B mod C
    题解:

    降幂公式 phi() 为欧拉函数

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #define ll __int64
    #define mod 10000000007
    using namespace std;
    char a[1000006];
    ll x,z;
    ll quickpow(ll x,ll y,ll z)
    {
        ll ans=1;
        while(y)
        {
            if(y&1)
                ans=ans*x%z;
            x=x*x%z;
            y>>=1;
        }
        return ans;
    }
    ll phi(ll n)
    {
        ll i,rea=n;
        for(i=2;i*i<=n;i++)
        {
            if(n%i==0)
            {
                rea=rea-rea/i;
                while(n%i==0)
                    n/=i;
             }
        }
        if(n>1)
            rea=rea-rea/n;
        return rea;
    }
    int main()
    {
        while(scanf("%I64d %s %I64d",&x,a,&z)!=EOF)
        {
            ll len=strlen(a);
            ll p=phi(z);
            ll ans=0;
            for(ll i=0;i<len;i++)
                ans=(ans*10+a[i]-'0')%p;
            ans+=p;
            printf("%I64d
    ",quickpow(x,ans,z));
        }
        return 0;
    }
  • 相关阅读:
    整数拆分
    win8 使用notepad++写C代码
    hessian客户端调用服务端测试类
    多线程环境下保证实现单线程的案例
    windows server 2008开机启动多个tomcat服务方法及遇到问题
    解决加载静态文件无法被浏览器缓存问题
    【拦截器】HandlerInterceptor接口
    【pac4j】OAuth 认证机制 入门篇
    【Linux部署 · JDK】在linux系统安装jdk
    【Linux部署 · GIT】在linux系统安装git和配置实现SSH
  • 原文地址:https://www.cnblogs.com/lipu123/p/14254798.html
Copyright © 2011-2022 走看看