快速幂与矩阵快速幂模板
快速幂模板
int qpow(int a,int b)
{
int ret=1;
while(b)
{
if(b&1) ret*=a;
b>>=1;
a*=a;
}
return ret;
}
矩阵快速幂模板
建议开 long long
struct Matrix
{
struct MatrixLine
{
int b[105];
int& operator[](int x)
{
return b[x];
}
} a[105];
MatrixLine& operator[](int x)
{
return a[x];
}
Matrix(){memset(a,0,sizeof a);}
Matrix operator*(const Matrix &b)
{
Matrix ret;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++) ret[i][j]=(ret[i][j]+a[i].b[k]*b.a[k].b[j])%MOD;
return ret;
}
Matrix& operator=(const Matrix &b)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
a[i].b[j]=b.a[i].b[j];
}
}
return *this;
}
} ans;
istream& operator>>(istream& in,Matrix &a)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
in>>a[i][j];
}
}
return in;
}
ostream& operator<<(ostream& out,const Matrix &a)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
out<<a.a[i].b[j]<<" ";
}
out<<endl;
}
return out;
}
Matrix qpow(int k)
{
Matrix ret;
for(int i=1;i<=n;i++) ret[i][i]=1;
while(k)
{
if(k&1) ret=ret*ans;
ans=ans*ans;
k>>=1;
}
return ret;
}

浙公网安备 33010602011771号