OJ题集m的n次方的最后三位数
Posted smile-yan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OJ题集m的n次方的最后三位数相关的知识,希望对你有一定的参考价值。
OJ题在线网址:http://acm.hnust.cn/JudgeOnline/problem.php?id=1787
【问题描述】
求m的n次方(12<m,n≤130000000000)的最后三位数。
例如:13的13次方的最后三位数是253,13的20次方的最后三位数是801。
【输入】
有多组测试数据
每组测试数据一行,包含2个数据,即整数m和n,两个数用逗号隔开。
【输出】
每行输出m的n次方的最后三位数。
【样例输入】
13,13
13,20
【样例输出】
253
801
【我的分析】
首先很容易百度得到这个算法,核心代码如下:
for(i=0; i<y; i++)
last=last*x%1000;
但是问题在于如何改进算法,从而满足时间要求。
基本思路就是让for循环次数变小。
【补充2023.02.20】
y %= 100 这个地方可能需要解释一下,当初有个重要结论,如下所示(这个地方我没有能力证明,不好意思)
求解 m 的 n 次方最后三位数,当 12<m,n≤130000000000)时,有
当 n 大于112 时,也就是 n 对 100 取余 大于等于 13 时,m 的 n 次方最后三位数等于 m 的 (n%100) 的最后三位数。
但是如果 n 小于等于 112 时,也就是 n 对 100 取余小于 13 时,m 的 n 次方最后三位数需要逐步计算并逐步取余。
这里希望能解释清楚,总体来说是一个规律性的问题。
如果有问题欢迎留言。
所有代码如下:
#include<stdio.h>
int main()
long long int i,x,y,last; /*变量last保存求X的Y次方过程中的部分乘积的后三位*/
// 输入
while(scanf("%lld,%lld",&x,&y)==2)
last=1;
x %= 1000; // 因为一个三位数的n次方的最后三位数只和这个数的最后三位数有关
y %= 100; // 因为可以发现这个是一个轮回,也就是说 (13,13)==(13,113)
// 需要注意轮回的起始位置是13
if(y < 13)
y += 100;
// 核心计算
for(i=0; i<y; i++)
last = last * x % 1000;
// 补充0
if (last < 100)
printf("0");
if(last < 10)
printf("0");
if(last < 1)
printf("0\\n");
continue;
printf("%d\\n", last%1000); /*打印结果*/
return 0;
提交这个代码上去,就不会出现时间超限这个错误了。
经历了二十多次失败的我也总算成功了。
以上是关于OJ题集m的n次方的最后三位数的主要内容,如果未能解决你的问题,请参考以下文章