P1397 [NOI2013] 矩阵游戏 题解
P1397 [NOI2013] 矩阵游戏 题解#
首先考虑 是怎么由 递推到的
考虑用矩阵优化两个递推式子,那么
显然,最后结果矩阵就等于:
但是由于 ,我们需要一些优化
矩阵费马小定理#
对于矩阵:
当 时,显然有:
若 互质,则由费马小定理可得:
所以就可以得到:
这样可以得到单位矩阵,性质十分优美
解法#
考虑利用矩阵费马小定理,实际上
其中
这样我们只需要预处理出 就行了
但是 或 时要特判
code:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long
const int p=1e9+7;
const int N=1e6+5;
inline ll read(){
ll x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
inline void add(ll &x,ll y){
x=(x+y)%p;
}
struct matrix{
int n;
ll A[2][2];
inline matrix(int x){n=x;memset(A,0,sizeof(A));}
inline void operator ~(){
for(int i=0;i<n;++i) A[i][i]=1;
}
inline matrix operator *(const matrix &B) {
matrix C(n);
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
for(int k=0;k<n;++k)
add(C.A[i][k],A[i][j]*B.A[j][k]);
return C;
}
inline matrix operator ^(const ll &idx) {
matrix B(n),D=*this;
~B;
for(ll q=idx;q;q/=2,D=D*D)
if(q&1) B=B*D;
return B;
}
};
ll n,m,a,b,c,d;
char s1[N],s2[N];
signed main(){
scanf("%s",s1+1);
scanf("%s",s2+1);
a=read(),b=read(),c=read(),d=read();
int len1=strlen(s1+1),len2=strlen(s2+1);
for(int i=1;i<=len1;++i)
n=((n<<1)+(n<<3)+(s1[i]^48))%(p-(a!=1));
for(int i=1;i<=len2;++i)
m=((m<<1)+(m<<3)+(s2[i]^48))%(p-(c!=1));
matrix A(2),B(2),x(2),y(2);
A.A[0][0]=a,A.A[0][1]=0,A.A[1][0]=b,A.A[1][1]=1;
B.A[0][0]=c,B.A[0][1]=0,B.A[1][0]=d,B.A[1][1]=1;
x=A^(m-1);
B=x*B;
y=B^(n-1);
x=y*x;
cout<<(x.A[0][0]+x.A[1][0])%p;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】