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次方的最后三位数的主要内容,如果未能解决你的问题,请参考以下文章

HDU_oj_2035 人见人爱A^B

OJ_1003.猜数游戏

OJ2171最佳路径

OJ 末位数字

[华为OJ--C++]001-字符串最后一个单词的长度

OJ 幂次方