快速幂,b是一个二进制数,i位代表着ai 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;
}
该博客介绍了矩阵快速幂算法及其应用,结合快速幂计算阶乘和组合数,并提供了相应的C++实现。通过预处理阶乘和逆元,提高了高精度计算的效率。同时,展示了如何使用矩阵快速幂解决矩阵的快速幂运算问题。
1926

被折叠的 条评论
为什么被折叠?



