读书人

代码含意

发布时间: 2012-08-31 12:55:03 作者: rapoo

代码含义
这是我周一做的中南大学程序设计竞赛,其中有道题是让你求a^b%c的结果,其中a,b,c都很大得要long long
下面是他们的代码,我看了半天都看不懂,有谁能帮忙么
[code=C/C++][/code]
/*****************************************************************************/
/* */
/* Copyright (C) 2012 中南大学CSU-ACM校队 */
/* 中南大学ACM爱好者协会 */
/* http://acm.csu.edu.cn All rights reserved */
/* */
/* Writen by: 中南大学 郭云镝(csgrandeur@csu.edu.cn) */
/* 信息科学与工程学院 */
/* */
/* Create at: 2012-04-14 */
/* */
/*****************************************************************************/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef long long LL;
LL box, ball, c;
LL MultiMod(LL a, LL b, LL c)
{
LL res = 0;
if(!b) return 0;
while(b > 1)
{
if(b & 1) res = (res + a) % c;
a = (a << 1) % c;
b >>= 1;
}
return (res + a) % c;
}
LL PowMod(LL a, LL b, LL c)
{
LL res = 1;
while(b > 1)
{
if(b & 1) res = MultiMod(res, a, c);
a = MultiMod(a, a, c);
b >>= 1;
}
return MultiMod(res, a, c);
}
int main()
{
while(scanf("%lld%lld%lld", &box, &ball, &c) != EOF)
printf("%lld\n", PowMod(box, ball, c));
return 0;
}


[解决办法]

C/C++ code
#include<stdio.h>#include<string.h>#include<stdlib.h>typedef long long LL;LL box, ball, c;//return (a*b)%3LL MultiMod(LL a, LL b, LL c){    LL res = 0;    if(!b) return 0;    //n位,b= X[n-1]*2^[n-1]+X[n-2]*2^[n-2]+...+X[0]*1;    //a*b%c=a*X[n-1]*2^[n-1]%c+a*X[n-2]*2^[n-2]%c+...+*X[0]*1%c;    //主要目的,防止 溢出.    while(b > 1)    {        if(b & 1) res = (res + a) % c;        a = (a << 1) % c;        b >>= 1;    }    return (res + a) % c;}LL PowMod(LL a, LL b, LL c){    LL res = 1;    // a^b 非递归 分解方法. b= 2^n+ d. d<2^n. n次循环结束之后a=a^(2^n). b=a^(b-2^n);    while(b > 1)    {        if(b & 1) res = MultiMod(res, a, c);        a = MultiMod(a, a, c);        b >>= 1;    }    return MultiMod(res, a, c);}int main(){    while(scanf("%lld%lld%lld", &box, &ball, &c) != EOF)        printf("%lld\n", PowMod(box, ball, c));    return 0;} 

读书人网 >C++

热点推荐