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;
    }
  • 相关阅读:
    【算法习题】青蛙跳台阶
    【转】从PowerDesigner概念设计模型(CDM)中的3种实体关系说起
    redis常用链接
    读书笔记——《redis入门指南(第2版)》第四章 进阶——4.1-5
    查询linux计算机的出口ip
    读书笔记——《redis入门指南(第2版)》第三章 入门
    vmware中的linux虚拟机配置以nat模式上网,并用xshell连接该虚拟机
    每日代码系列(1)
    第一次尝试自己编写
    原型模式
  • 原文地址:https://www.cnblogs.com/lipu123/p/14254798.html
Copyright © 2011-2022 走看看