码迷,mamicode.com
首页 > 其他好文 > 详细

hdu2035 A^B (同余及其基本性质,快速幂)

时间:2018-10-04 12:52:56      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:mes   while   res   color   图片   运算   img   tail   return   

开始用了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 =( (x2)2....)

      只要做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\n",mod_pow(m,n,1000));
    return 0;
}
View Code

 

hdu2035 A^B (同余及其基本性质,快速幂)

标签:mes   while   res   color   图片   运算   img   tail   return   

原文地址:https://www.cnblogs.com/lyqf/p/9741975.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!