杭电OJ看到一个答案,不明白思路求告知

题目:ProblemDescription求A^B的最后三位数表示的整数。说明:A^B的含义是“A的B次方”Input输入数据包含多个测试实例,每个实例占一行,由两个正整... 题目:
Problem Description

求A^B的最后三位数表示的整数。说明:A^B的含义是“A的B次方”

Input

输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=10000),如果A=0, B=0,则表示输入数据的结束,不做处理。

Output

对于每个测试实例,请输出A^B的最后三位表示的整数,每个输出占一行。

Sample Input
2 312 66789 100000 0

Sample Output
8984
代码:

怎么理解他的思路?
展开
 我来答
风若远去何人留
推荐于2016-09-15 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450106
专业C/C++软件开发

向TA提问 私信TA
展开全部

简单来说 就是对于任意的m*n 最后三位为

m*n%1000 它的值和((m%1000) * (n%1000))%1000的值是相同的

这个是一个简单的数学题 相信你可以理解

这样就有一个朴素的思路

long func(long a, long b)

    long r = 1;
    a %= 1000;
    while(b--)
    {
        r*=a;
        r%=1000;
    }
}

不过这样做需要执行b次乘法和模除 用专业一点的话说 它的时间开销是O(n)的

那么如果每次采用分组的方式

即对于a*a*a*a...*a(b个a) 不是依次来处理 而是一次处理一半

那么就是你看到的程序了

即a^b = a^(b/2) * a^(b/2) (当b为偶数)

a^b = a^(b/2) * a^(b/2) *a(当b为奇数)

同样应用最开始的(m*n)%1000 = ((m%1000) * (n%1000))%1000 的规律

就变成了你说的程序

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式