次方求模(快速幂算法) nyoj 102

算法分析:

大数问题,需要利用快速幂取模算法


所谓的快速幂,实际上是快速幂取模的缩写,简单的说,就是快速的求一个幂式的模(余)。在程序设计过程中,经常要去求一些大数对于某个数的余数,为了得到更快、计算范围更大的算法,产生了快速幂取模算法。求a^b mod c = 几。 (result就是取余后的结果)

   首先我们需要知道一点:首先要了解这样一个公式:a^b mod c=(a mod c)^b mod c(详细证明请看数论或者离散数学)
                                         了解了这个公式,我们可以先让a关于c取余,这样可以大大减少a的大小, 于是不用思考的进行了改进,代码如下:

主要思想是:

     利用二进制将运算二分,大大减少了运算量,同时利用公式 a^b mod c=(a mod c)^b mod c,先将a对c取余是数据缩小从而使运算量减小

例如3^18    18的二进制为10010  算法模拟二进制的转换(辗转相处法)     r=3^2*3^16  

int Pow(int a, int b, int c) 
{ 
    int r = 1; a = a % c; 
    while(b>0) 
    { 
         
        if(b % 2 = = 1) 
            r = (r * a) % c;
        b = b/2; 
        a = (a * a) % c; 
    } 
    return r;
}


nyoj 题目地址http://acm.nyist.net/JudgeOnline/problem.php?pid=102

Code:

#include<stdio.h>
#include<stdlib.h>
long long pow(long long a,long long b,long long c);
int main(void)
{
    long long a,b,c;
    int n;
    scanf("%d",&n);
    while(n--){
        scanf("%lld%lld%lld",&a,&b,&c);
        printf("%lld\n",pow(a,b,c));
    }
    return 0;
}
long long pow(long long a,long long b,long long c)
{
    int r=1;
    a=a%c;
    while(b>0){
        if(b%2==1)
            r=(r*a)%c;
        b=b/2;
        a=(a*a)%c;
    }
    return r;
}

参考博客:http://www.2cto.com/kf/201408/322144.html 

这个博客讲的十分详细









你可能感兴趣的:(数论)