快速幂,b是一个二进制数,i位代表着
a
i
a^ {i}
ai
inf是一个要用于取余的质数
int qpow(int a,int b)
{
int ans=1,base=a;
while(b>0)
{
if(b&1)
{
ans=ans*base;
}
base=base*base;
b>>=1;
}
return ans;
}
阶乘预处理
void init(){
int i;
fac[0]=1;
inv[0]=1;
fac[1]=1;
inv[1]=1;
for (i=2;i<50010;i++){
fac[i]=((fac[i-1]*i)%inf+inf)%inf;
inv[i]=(qpow(fac[i],inf-2)+inf)%inf;
}
}
阶乘
int C(int n,int m){
if (n<m||m<0) return 0;
return (fac[n]*inv[m]%inf*inv[n-m]%inf+inf)%inf;
}
矩阵快速幂
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod=1000000007;
ll x,y;
struct P{
ll m[100][100];
};
P a,e,ans;
P jz(P a,P b)
{
P c;
for(int i=1;i<=x;i++)
for(int j=1;j<=x;j++)
c.m[i][j]=0;
for(int i=1;i<=x;i++)
for(int j=1;j<=x;j++)
for(int k=1;k<=x;k++)
c.m[i][j]=c.m[i][j]%mod+a.m[i][k]*b.m[k][j]%mod;
return c;
}
P mi(P a,ll b)
{
P ans=e;
while(b)
{
if(b&1) ans=jz(ans,a);
a=jz(a,a);
b>>=1;
}
return ans;
}
int main()
{
cin>>x>>y;
for(int i=1;i<=x;i++)
{
for(int j=1;j<=x;j++)
{
cin>>a.m[i][j];
}
e.m[i][i]=1;
}
ans=mi(a,y);
for(int i=1;i<=x;i++)
{
for(int j=1;j<=x;j++)
{
cout<<ans.m[i][j]%mod<<" ";
}
cout<<endl;
}
return 0;
}