您的位置:首页 > 其它

2013年暑假队内选拔赛题解2

2013-07-08 16:24 183 查看
D 人见人爱A^BmodC

Problem Description
计算A的B次幂对c取模(A^BmodC)并且1<=A,B,C<=32768.
输入三个整数A,B,C,输入文件每一行依次三个整数a,b,c用空格隔开
每行输出一个运算结果

Sample:

Input:

3 4 5
10 10 100
45 67 89
1 1 1
Output:

1
0
45
0

解题思路:
本题为幂模运算,将其转化为乘模运算,实质为二分法。相关算法为蒙哥马利幂模运算,如要了解可以点击这里http://baike.baidu.com/view/8426503.htm
说明:a^b%c在以后会经常用到,此类运算出现的很频繁,需要熟练掌握。题中二分的思想也很基础。

Code:

#include<iostream>
using namespace std;
int main()
{
int a,b,c;
while(cin>>a>>b>>c)
{
int temp=1;
while(b)
{
if(b%2==0)
{
a=a*a%c;
b/=2;
}
else
{
temp=a*temp%c;
b-=1;
}
}
cout<<temp<<endl;
}
return 0;
}


本题答案中有一些小常识,值得借鉴,在这里强调一下,先把代码贴出来:

while(b)
{

if(b&1)//二进制与运算,可以判断奇偶;当结果不为0时(奇数为1,偶数为0),条件成立;即当b为奇数时if成立;if(n)等价于if(n!=0)
temp=(temp*a)%c;
b>>=1;//就是相当于b = b >> 1;>>的意思是二进制算术右移
a=(a*a)%c;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: