zoukankan      html  css  js  c++  java
  • [板子]快速幂&矩阵快速幂

    不会的来这看:https://www.cnblogs.com/CXCXCXC/p/4641812.html

    简单的一说:当转换为二进制的时候有位运算这种黑科技,&相当于%2判断奇偶性。

    x&1==0为偶,x&1==1为奇

    &运算通常用于二进制取位操作,例如一个数 & 1 的结果就是取二进制的最末位。还可以判断奇偶x&1==0为偶,x&1==1为奇

    只有在奇数情况的时候把base乘进去,每一次用base*base扩大平方,b的二进制去除一位。

     1 int poww(int a,int b){
     2     int ans=1,base=a;
     3     while(b!=0){
     4         if(b&1==1)
     5           ans*=base;
     6         base*=base;
     7         b>>=1;
     8   }
     9     return ans;
    10 }

     接下来是矩阵快速幂。

    摘自:blog.csdn.net/wust_zzwh/article/details/52058209

    其中c[i][j]为A的第i行与B的第j列对应乘积的和,即:

     1 #include<bits/stdc++.h>
     2 
     3 #define LL long long
     4 using namespace std;
     5 
     6 LL n,k;
     7 
     8 const long long pi=1e9+7;
     9 
    10 struct ska{
    11     LL a[100+10][100+10];
    12 }p,pp;
    13 
    14 ska X(ska x,ska y){
    15     ska box;
    16     
    17     for(LL i=1;i<=n;i++){
    18         for(LL j=1;j<=n;j++){
    19             box.a[i][j]=0;
    20         }
    21     }
    22     
    23     for(LL i=1;i<=n;i++){
    24         
    25         for(LL j=1;j<=n;j++){
    26             
    27             for(LL k=1;k<=n;k++){
    28                 
    29                 box.a[i][j]=(box.a[i][j]+(x.a[i][k]*y.a[k][j])%pi)%pi;
    30                 
    31             }
    32         }
    33     }
    34     
    35     return box;
    36 }
    37 
    38 ska quick_pow(LL kk){
    39     
    40     ska ans;
    41     
    42     for(LL i=1;i<=n;i++){
    43         ans.a[i][i]=1;
    44     }
    45    
    46     while(kk!=0){
    47         
    48         if(kk&1==1){
    49             
    50             ans=X(ans,p);
    51         }
    52         
    53         kk>>=1;
    54         
    55         p=X(p,p);
    56     
    57     }
    58     
    59     return ans;
    60 }
    61 
    62 int main(){
    63     scanf("%lld%lld",&n,&k);
    64     
    65     for(LL i=1;i<=n;i++){
    66         
    67         for(LL j=1;j<=n;j++){
    68             
    69             scanf("%lld",&p.a[i][j]);
    70             
    71         }
    72     }
    73     
    74     pp=quick_pow(k);
    75     
    76     for(LL i=1;i<=n;i++){
    77         
    78         for(LL j=1;j<=n;j++){
    79             
    80             printf("%lld ",pp.a[i][j]);
    81             
    82         }
    83         
    84         cout<<endl;
    85     }
    86     return 0;
    87 }
  • 相关阅读:
    02-CSS基础与进阶-day4_2018-08-31-20-42-09
    02-CSS基础与进阶-day4__2018-08-31-20-22-57
    02-CSS基础与进阶-day3_2018-08-29-21-30-56
    02-CSS基础与进阶-day3_2018-08-29-20-39-58
    02-CSS基础与进阶-day3_2018-08-29-20-20-56
    02-CSS基础与进阶-day2_2018-08-27-22-00-56
    02-CSS基础与进阶-day2__2018-08-27-21-27-31
    02-CSS基础与进阶-day2_2018-08-27-20-57-55
    Pytest(12)pytest缓存
    Pytest(11)allure报告
  • 原文地址:https://www.cnblogs.com/Fylsea/p/7809371.html
Copyright © 2011-2022 走看看