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

来源:互联网 发布:远景能源怎么样 知乎 编辑:程序博客网 时间:2024/06/02 01:58

算法分析:

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


所谓的快速幂,实际上是快速幂取模的缩写,简单的说,就是快速的求一个幂式的模(余)。在程序设计过程中,经常要去求一些大数对于某个数的余数,为了得到更快、计算范围更大的算法,产生了快速幂取模算法。求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 

这个博客讲的十分详细








0 0