[NOI2013]矩阵游戏
题目描述
婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的
递推式中
现在婷婷想知道
分析
首先,看到题目已经直接把递推式给出来了,数据范围很大,硬推肯定
通过观察递推式我们可以发现:
设状态矩阵为
这是在同一行中转移的情况,再来看从上一行转移到下一行,根据
有了两个转移矩阵,我们就可以进行快速幂了。从
但是还有一个问题。输入的
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
long long read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=(x<<3)+(x<<1)+(c^48);
c=getchar();
}
return x*f;
}
const int mod=1e9+7;
int n,m,a,b,c,d;
string ns,ms;
struct matrix
{
int mat[10][10],n,m;
matrix(int a,int b)
{
memset(mat,0,sizeof(mat));
n=a,m=b;
}
bool set_i()
{
if(n!=m)return false;
for(int i=1;i<=n;i++)
mat[i][i]=1;
return true;
}
matrix operator *(matrix a)
{
matrix res(n,a.m);
for(int i=1;i<=n;i++)
for(int j=1;j<=a.m;j++)
for(int k=1;k<=m;k++)
res.mat[i][j]=(res.mat[i][j]+mat[i][k]*a.mat[k][j]%mod)%mod;
return res;
}
};
void display(matrix a)
{
for(int i=1;i<=a.n;i++)
{
for(int j=1;j<=a.m;j++)
printf("%d ",a.mat[i][j]);
puts("");
}
}
matrix qpow(matrix a,int b)
{
matrix ans(a.n,a.n);
ans.set_i();
while(b)
{
if(b&1)ans=(ans*a);
a=(a*a);
b>>=1;
}
return ans;
}
signed main()
{
cin>>ns>>ms;
a=read();b=read();c=read();d=read();
for(int i=0;i<ns.length();i++)
{
if(a == 1)n=((n<<3)+(n<<1)+(ns[i]^48))%mod;
else n=((n<<3)+(n<<1)+(ns[i]^48))%(mod-1);
}
for(int i=0;i<ms.length();i++)
{
if(c==1)m=((m<<3)+(m<<1)+(ms[i]^48))%mod;
else m=((m<<3)+(m<<1)+(ms[i]^48))%(mod-1);
}
matrix x(1,2),p1(2,2),p2(2,2);
x.mat[1][1]=x.mat[1][2]=1;
p1.mat[1][1]=a;p1.mat[2][1]=b;p1.mat[2][2]=1;
p2.mat[1][1]=c,p2.mat[1][2]=0,p2.mat[2][1]=d,p2.mat[2][2]=1;
p1=qpow(p1,m-1);
p2=p1*p2;
p2=qpow(p2,n-1);
p1=p2*p1;
x=x*p1;
printf("%lld",x.mat[1][1]%mod);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】