1. 快速幂 O(logn)
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
ll mod_pow(ll x,ll n)
{
ll ret=1;
while(n>0)
{
if(n&1)
ret=ret*x;
x=x*x;
n>>=1;
}
return ret;
}
int main()
{
ll x,n;
while(~scanf("%lld%lld",&x,&n))
{
ll ans=mod_pow(x,n);
printf("%lld\n",ans);
}
return 0;
}
2.矩阵
矩阵相乘一般不满足交换律
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int M=100;
int c[M][M];
void multi(int a[][M],int b[][M],int n)
{
memset(c,0,sizeof(c));
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
for(int k=0;k<n;k++)
{
c[i][j]+=a[i][k]*b[k][j];
}
printf("%d ",c[i][j]);
}
printf("\n");
}
}
int main()
{
int n;
int a[M][M],b[M][M];
while(~scanf("%d",&n))
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&a[i][j]);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&b[i][j]);
multi(a,b,n);
}
return 0;
}
矩阵乘法也可以这样写 对于矩阵0比较多的情况可以起到一定的优化作用
void multi(int a[][M],int b[][M],int n)
{
memset(c,0,sizeof(c));
for(int i=0;i<n;i++)
{
for(int k=0;k<n;k++)
{
if(a[i][k]==0)
continue;
for(int j=0;j<n;j++)
{
c[i][j]+=a[i][k]*b[k][j];
}
}
}
}
3.矩阵快速幂
类似于快速幂,只是把数换成了矩阵
const int M=10;
int tmp[M][M];
void multi(int a[][M],int b[][M],int n)
{
memset(tmp,0,sizeof tmp);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
tmp[i][j]+=a[i][k]*b[k][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=tmp[i][j];
}
int res[M][M];
void Pow(int a[][M],int n)
{
memset(res,0,sizeof res);
for(int i=1;i<=n;i++) res[i][i]=1;
while(n)
{
if(n&1)
multi(res,a,n);//res=res*a;
multi(a,a,n);//a=a*a
n>>=1;
}
}