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
  • 相关阅读:
    Flutter页面-基础Widget
    Data 方法、异常与类
    kafka手动设置offset
    centos 安装ftp服务BUG
    定时任务
    Java垃圾收集算法
    ByteBuffer数据结构
    HelloWorldDynamic
    HelloWorld
    sql技巧(增册改查)
  • 原文地址:https://www.cnblogs.com/Taskr212/p/9593800.html
Copyright © 2011-2022 走看看