不会的来这看: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 }