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

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;
	}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值