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
  • 相关阅读:
    html 上传图片前预览
    php获取当月天数及当月第一天及最后一天、上月第一天及最后一天实现方法
    php 计算 pdf文件页数
    php 获取半年内每个月的订单数量, 总价, 月份
    php 获取两个数组之间不同的值
    小程序支付功能
    关于nginx的Job for nginx.service failed because the control process exited with error code.错误
    linux 安装 Apollo
    MongoDB待续。。。
    ABP vNext...待续
  • 原文地址:https://www.cnblogs.com/Taskr212/p/9593800.html
Copyright © 2011-2022 走看看