zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    进制
    流程控制
    运算符
    格式化输出
    数据结构-树的遍历
    A1004 Counting Leaves (30分)
    A1106 Lowest Price in Supply Chain (25分)
    A1094 The Largest Generation (25分)
    A1090 Highest Price in Supply Chain (25分)
    A1079 Total Sales of Supply Chain (25分)
  • 原文地址:https://www.cnblogs.com/Taskr212/p/9593800.html
Copyright © 2011-2022 走看看