目录
问题描述
输入三个正整数,求的值。
输入
输入有多组测试例
对每组测试例,有三个正整数
输出
对每组测试例输出一行,是的值。
输入样例
2 10 9
3 18132 17
输出样例
7
13
算法分析
由于数据的规模很大,如果直接计算,不仅需要采用高精度,而且时间复杂度很大。例如,,但超出了整数型的表示范围,不能直接计算。
模运算有如下运算规则:
根据公式(2),显著降低了a的值。
根据公式(1),显著降低了p的值。
因此,得到如下递推公式:
该递推公式体现了分治策略的应用,将一个大的指数p逐渐减小,同时对运算过程的中间结果不断进行模运算,降低中间结果的数字大小,避免了使用高精度运算。
利用递推公式实现取余运算,如算法1所示。
算法1:
//计算a^p%k的值
//为了防止运算过程中的溢出,采用64位整数,在C++环境中是long long
int mod(__int64 a,__int64 p,__int64 k)
{
if(p == 1) return a % k;
if(p % 2) return mod(a%k , p-1, k); //p是奇数
else return mod((a*a)%k,p/2,k); //p是偶数
}
//主函数main()中的数据读取与调用
unsigned a,p,k;
while (scanf("%u %u %u",&a,&p,&k)!=EOF)
printf("%d\n",mod(a,p,k));
参考书籍
算法设计与分析 -----以ACM大学生程序设计竞赛在线题库为例 ------清华大学出版