快速幂的证明(https://www.luogu.com.cn/problem/solution/P1226)看这个就行啦https://www.luogu.com.cn/problem/P1226这个是题,然后捏代码。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int k;
int mod;
signed main()
{
int ans=1;
scanf("%lld%lld%lld",&n,&k,&mod);
printf("%lld^%lld mod %lld=",n,k,mod);
while(k>0)
{
if(k%2!=0) ans=(ans*n)%mod;
n=(n*n)%mod;
k=k>>1;
}
printf("%lld",ans);
return 0;
}
P3390 【模板】矩阵快速幂(https://www.luogu.com.cn/problem/P3390)
通常用来优化一些奇奇怪怪的柿子,嗯,不会推!
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
struct node
{
int n,m;
int a[102][102];
node()
{
memset(a,0,sizeof(a));
};
void bd(int x)
{
n=x;
m=x;
for(int i=1;i<=x;i++) a[i][i]=1;
}
void it(int x,int y)
{
n=x;
m=y;
for(int i=1;i<=100;i++)
{
for(int j=1;j<=100;j++) a[i][j]=0;
}
}
};
node operator *(const node &a,const node &b)//重中之重!
{
node fh;
fh.it(a.n,b.m);
for(int k=1;k<=(a.m+b.n)/2;k++)
{
for(int i=1;i<=a.n;i++)
{
for(int j=1;j<=b.m;j++) fh.a[i][j]=(fh.a[i][j]+a.a[i][k]*b.a[k][j])%1000000007;
}
}
return fh;
}
node a,b;
signed main()
{
int k;
scanf("%lld%lld",&n,&k);
a.it(n,n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++) scanf("%lld",&a.a[i][j]);
}
node ans;
ans.bd(n);
while(k>0)
{
if(k%2==1) ans=ans*a;
a=a*a;
k=k>>1;
}
// printf("%d ",ans.n);
for(int i=1;i<=ans.n;i++)
{
for(int j=1;j<=n;j++) printf("%lld ",ans.a[i][j]);
printf("\n");
}
return 0;
}