题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=1097
题目要求
求a^b的最后一位数是几
易知a^b的最后一位数即(a%10)^b的最后一位数,但是b的范围太大,观察规律可知,个位数的乘方去最后一位数是循环的,例如个位数为0和1,无论b为多少,其结果均为0和1
个位数字 | 循环相乘取个位数 | 循环间隔 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 1 |
2 | 2,4,8,6 | 4 |
3 | 3,9,7,1 | 4 |
4 | 4,6 | 2 |
5 | 5 | 1 |
6 | 6 | 1 |
7 | 7,9,3,1 | 4 |
8 | 8,4,2,6 | 4 |
9 | 9,1 | 2 |
易知只需计算(a%10)^(b%(a%10对应的循环间隔))即可。
如果a = 8, b = 4, 按照上述计算方法得出的结果为(8%10)^(4%4) = 8^0 = 1, 显然结果是错误的,如果b%(a%10对应的循环间隔)为0,此时要取b为a%10对应的循环间隔,而不再进行取余。
代码如下:
#include<stdio.h>
int main()
{
int num[10] = { 1,1,4,4,2,1,1,4,4,2 };
int n, m, temp;
while (~scanf("%d%d", &n, &m))
{
n = n % 10;
m = m%num[n];
if (m == 0)
{
m = num[n];
}
temp = n;
for (int i = 1; i < m; ++i)
{
temp = (temp*n) % 10;
}
printf("%d\n", temp);
}
return 0;
}