您的位置:首页 > 其它

矩阵快速幂模板及其应用(洛谷3390)(洛谷1962)

2017-07-27 20:39 344 查看
题意:给定n*n的矩阵A,求A^k
代码,思路见前一篇。

#include<bits/stdc++.h>
#define maxn 120
#define mod 1000000007
#define LL long long
using namespace std;
LL n,k;

struct Matrix
{LL s[maxn][maxn];};

Matrix operator * (Matrix a,Matrix b)
{
Matrix tmp;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
LL x=0;
for(int k=1;k<=n;k++)
x+=(a.s[i][k]*b.s[k][j])%mod;
tmp.s[i][j]=x%mod;
}
return tmp;
}

Matrix Pow(Matrix a,LL k)
{
Matrix b;
for(int i=1;i<=n;i++) b.s[i][i]=1;
while(k)
{
if(k&1) b=b*a;
a=a*a;
k>>=1;
}
return b;
}

int main()
{
cin>>n>>k;
Matrix a;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>a.s[i][j];
a=Pow(a,k);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
cout<<a.s[i][j]%mod<<" ";
cout<<"\n";}
return 0;
}


 

 应用斐波那契数列,构造一个1{1,1,1,0}的2*2矩阵就可以做了

注意特判

#include<bits/stdc++.h>
#define maxn 120
#define mod (1000000007)
#define LL long long
using namespace std;
LL n,k;
struct Node{
LL s[maxn][maxn];
}str;

void init()
{
for(int i=1;i<=maxn;i++) str.s[i][i]=1;
}
Node operator * (Node a,Node b)
{
Node tmp;
LL x=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
x=0;
for(int k=1;k<=n;k++)
x+=a.s[i][k]*b.s[k][j]%mod;
tmp.s[i][j]=x%mod;
}
return tmp;
}
Node Pow(Node a)
{
Node tmp=str;
while(k)
{
if(k&1) tmp=tmp*a;
a=a*a;
k>>=1;
}
return tmp;
}
int main()
{
init();n=2;
cin>>k;
if(k==0) cout<<"0"<<endl;
if(k==1) cout<<"1"<<endl;
else
{
Node ans;
ans.s[1][1]=ans.s[1][2]=ans.s[2][1]=1;
ans.s[0][0]=0;
k--;
ans=Pow(ans);
cout<<ans.s[1][1]<<endl;
}
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: