zoukankan      html  css  js  c++  java
  • 快速幂求解

    顾名思义,快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效

    用法:用于求解 a 的 b 次方,而b是一个非常大的数,用O(n)的复杂度会超时。那么就需要这个算法,注意它不但可以对数求次幂,而且可用于矩阵快速幂。

    把b转换成二进制数,该二进制位数有logb位;该二进制数第i位的权为2i-1
     
    例如:
         11的二进制是1011
    11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
    因此,我们将a¹¹转化为算
     
     对数求次幂:(求a^b次方的值) 时间复杂度为logb
     1 public static int Fast_pow(int a, int b){  
     2         int ans=1;//存放最后结果 
     3         int mod = 101;//存放取模值
     4         while(b>0)  {  
     5             if(b%2==1){  
     6                 ans=(ans*a)%mod;  
     7             }
     8             a=(a*a)%mod;  
     9             b >>= 1;  
    10         }  
    11         return ans;  
    12     }

    矩阵求次幂例题:

     1 /**
     2  * 网易笔试第五题:时间不超过1秒
     3  * 输入数据包括两行:
     4  * 第一行为两个整数n(2 ≤ n ≤ 50)和k(1 ≤ k ≤ 2000000000),以空格分隔
     5  * 第二行为魔力手环初始的n个数,以空格分隔。范围都在0至99.
     6  * 输出描述:输出魔力手环使用k次之后的状态,以空格分隔,行末无空格。
     7 
     8     输入例子:
     9     3 2
    10     1 2 3
    11     
    12     输出例子:
    13     8 9 7
    14 
    15  */
    16 
    17 import java.util.Scanner;
    18 
    19 
    20 public class Main {
    21     private final static int MOD = 100;
    22     public static void main(String[] args) {
    23         //时间复杂度(n^3)logk 
    24         Scanner in = new Scanner(System.in);
    25         int n = in.nextInt();
    26         int k = in.nextInt();
    27         
    28         int[][] ans= new int[1][n];
    29         for(int i = 0; i < n; i++){
    30             ans[0][i] = in.nextInt();
    31         }
    32         
    33         //构造满足条件的矩阵
    34         int[][] src = new int[n][n];
    35         for(int i = 0;  i < n; i++){
    36             
    37             if(i < (n-1)){
    38                 src[i][i] = 1;
    39                 src[i+1][i] = 1;
    40             }else{
    41                 src[i][i] = 1;
    42                 src[0][i] = 1;
    43             }
    44         }
    45         
    46         //快速矩阵幂
    47         while(k > 0){
    48             if(k % 2 == 1){//相当于k&1
    49                 ans = MatrixMul(ans, src);
    50             }
    51             src = MatrixMul(src, src);
    52             k >>= 1;
    53         }
    54         
    55         System.out.print(ans[0][0]);
    56         for(int i = 1; i < ans[0].length; i++){
    57             System.out.print(" "+ans[0][i]);
    58         }
    59         in.close();
    60     }
    61     
    62     /**
    63      * 矩阵乘法运算
    64      * @param a 矩阵a 
    65      * @param b 矩阵b  a和b满足乘法要求a[0].length==b.length
    66      * @return 
    67      */
    68     public static int[][] MatrixMul(int[][] a,int[][] b){
    69         int[][]  tmp = new int[a.length][a[0].length];
    70         
    71         for(int i = 0;  i < a.length; i++){
    72             for(int j = 0; j < b[0].length; j++){
    73             
    74                 for( int  k = 0; k < a[0].length; k++){
    75                     tmp[i][j] = (tmp[i][j] + a[i][k] *b[k][j])%MOD; 
    76                 }
    77             }
    78         }
    79         return tmp;
    80     }
    81 }
  • 相关阅读:
    eclipse导入源码
    servlet文件上传及下载
    MediatorPattern(中介者模式)-----Java/.Net
    IteratorPattern(迭代器模式)-----Java/.Net
    CommandPattern(命令模式)-----Java/.Net
    ResponsibilityChainPattern(责任链模式)-----Java/.Net
    TemplateMethodPattern(模板方法模式)-----Java/.Net
    InterpreterPattern(解释器模式)-----Java/.Net
    ProxyPattern(代理模式)-----Java/.Net
    FlyweightPattern(享元模式)-----Java/.Net
  • 原文地址:https://www.cnblogs.com/lezhifang/p/6655295.html
Copyright © 2011-2022 走看看