HDU 1097(m次幂的个位数 规律)

HDU 1097(m次幂的个位数 规律)

题意是求 n^m 结果的最后一位数。

可以用快速幂取模的方法做,当然本题还有更简单的方法:

所有数字( 0 - 9 )的 m 次幂的个位数不会受进位的影响,只收到乘数的影响,所以在结果中一旦出现之前出现过的数字即可以这两个数字之间的一段作为循环,0 - 9 最多十个数字,其循环的长度一定小于 10,计算发现各数字的规律如下:

0:0 ...

1:1 ... 

2:2,4,8,6,2,...

3:3,9,7,1,3,...

4:4,6,4,...

5:5 ...

6:6 ...

7:7,9,3,1,7,...

8:8,4,2,6,8,...

9:9,1,9,...

还要注意 n 不一定是个位数,要记得取个位数。

代码如下:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     int a,b;
 6     while(~scanf("%d%d",&a,&b))
 7     {
 8         if(!b)
 9         {
10             puts("1");
11             continue;
12         }
13         a %= 10;
14         switch(a)
15         {
16             case 0:
17                 puts("0"); break;
18             case 1:
19                 puts("1"); break;
20             case 2:
21                 switch(b%4)
22                 {
23                     case 1: puts("2"); break;
24                     case 2: puts("4"); break;
25                     case 3: puts("8"); break;
26                     case 0: puts("6");
27                 } break;
28             case 3:
29                 switch(b%4)
30                 {
31                     case 1: puts("3"); break;
32                     case 2: puts("9"); break;
33                     case 3: puts("7"); break;
34                     case 0: puts("1");
35                 } break;
36             case 4:
37                 printf("%d
",b&1?4:6); break;
38             case 5:
39                 puts("5"); break;
40             case 6:
41                 puts("6"); break;
42             case 7:
43                 switch(b%4)
44                 {
45                     case 1: puts("7"); break;
46                     case 2: puts("9"); break;
47                     case 3: puts("3"); break;
48                     case 0: puts("1");
49                 } break;
50             case 8:
51                 switch(b%4)
52                 {
53                     case 1: puts("8"); break;
54                     case 2: puts("4"); break;
55                     case 3: puts("2"); break;
56                     case 0: puts("6");
57                 } break;
58             case 9:
59                 printf("%d
",b&1?9:1); break;
60         }
61     }
62     return 0;
63 }
View Code

这是本人的比较繁琐的方法,别人优秀的做法如下:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int d[10] = {1,1,4,4,2,1,1,4,4,2};
 4 int f[10][4]={{0},{1},{6,2,4,8},{1,3,9,7},{6,4},{5},{6},{1,7,9,3},{6,8,4,2},{1,9}};
 5 int main(){
 6     int a,b;
 7     while(~scanf("%d%d",&a,&b))
 8         printf("%d
",f[a%10][b%d[a%10]]);
 9     return 0;
10 
11 }
View Code