Tyvj1118乘方取余问题

输入a,n,k(1<=a,n<=1e9   1<=k<=10000 ,
注意:有多组测试数据,请用EOF标志判断结束输入):
2 32 5
2 30 5
输出(a^n)%k的结果(a的n次方被k除的余数):
1
4

问题分析:因为存在

若n为偶数:

a^n=(a*a)^[n/2];

若n为奇数:

a^n=a*(a*a)^[n/2];

所以原问题就可以进行简化了

代码如下

#include<iostream>
using namespace std;
int PowerMod(int a, int n, int k)
{
	if (n==0)
	   return 1;
	int tmp=PowerMod((a*a)%k, n/2, k);
    if(n%2)
		tmp=(tmp*a)%k;
	return tmp;
}
int main()
{
	int a,n,k;
	while (cin>>a>>n>>k)
	{
	   cout<<PowerMod(a, n,k)<<endl;
	}
	return 0;
}

posted @ 2010-10-28 20:25  hailong  阅读(193)  评论(0编辑  收藏  举报