zoukankan      html  css  js  c++  java
  • hdu2035 A^B (同余及其基本性质,快速幂)

    开始用了pow函数,6789^10000算出来时负的,应该是超了,但是网上搜了一下说c++的pow()是支持longlong的提供重载函数的https://blog.csdn.net/major_zhang/article/details/51456681,难道是结果超了???

    后来又发现循环内部变量用的int……

    再后来……循环*A;还是wa……

    重点在这:一直乘下去,结果会超,有一个数学规律:结果每次对1000取余,后三位不变,不懂个话,补一下数论知识(同余运算及其基本性质)

    http://www.matrix67.com/blog/archives/236

    代码:

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    int main()
    {
        long long int n,m;
        while(cin>>n>>m)
        {
            if(n==0&&m==0)
            break;
            long long int t=1;
            for(long long int i =1;i<=m;i++)
            {
                t*=n;
                if(t>=1000)
                    t = t%1000;    
                }    
            cout<<t<<endl;
        }
        return 0;
    }
    View Code

    快速幂:

    快速幂可以高效的计算幂运算。如果我们使用循环来计算的话,那么时间复杂度就是 O(n) ,使用快速幂的话就只用 O(log n)。

     如果我们求解 2^k。可以将其表示为

                 x^n =( (x²)²....)

          只要做k次平方运算就可以了,由此我们可以想到,先将n表示为2的幂方次之和

                 n = 2^k1 + 2^k2 + 2^k3...

          就有

               x^n = x^(2^k1) x^(2^k2) x^(2^k3)...

    快速幂模板:

    typedef long long ll; //注意这里不一定都是long long 有时 int 也行
    ll mod_pow(ll x, ll n, ll mod){
        ll res = 1;
        while( n > 0 ){ 
            if( n & 1 ) res = res * x % mod;    //n&1其实在这里和 n%2表达的是一个意思
            x = x * x % mod;
            n >>= 1;                 //n >>= 1这个和 n/=2表达的是一个意思
        }
        return res;
    }

    递归版:

    typedef long long ll;
    ll mod_pow(ll x, ll n, ll mod){
        if( n == 0 ) return 1;
        ll res = mod_pow( x * x % mod, n / 2, mod );
        if( n & 1 ) res = res * x % mod;
        return res;
    }

    快速幂解决这道题:

    #include<stdio.h>
    int mod_pow(int x, int n,int mod){      //快速幂
        int res = 1;
        while( n > 0 ){
            if( n & 1 ) res = res * x % mod;
            x = x * x % mod;
            n >>= 1;
        }
        return res;
    }
    int main(){ 
        int m,n;
        while(scanf("%d%d",&m,&n),n||m)
            printf("%d
    ",mod_pow(m,n,1000));
        return 0;
    }
    View Code
  • 相关阅读:
    RabbitMQ与AMQP协议详解
    MemCache超详细解读
    ASP.NET Web API通过ActionFilter来实现缓存
    ASP.NET Web API 通过Authentication特性来实现身份认证
    什么是CSR证书申请文件?
    跨平台的 SQL 客户端
    Java生成公私钥对
    git 删除错误提交的commit
    ServiceStack.Text反序列化lowercase_underscore_names格式的JSON
    .NET AES加解密(128位)
  • 原文地址:https://www.cnblogs.com/lyqf/p/9741975.html
Copyright © 2011-2022 走看看