P1397 [NOI2013] 矩阵游戏 题解

P1397 [NOI2013] 矩阵游戏 题解#

首先考虑 Fn,m 是怎么由 F1,1 递推到的

考虑用矩阵优化两个递推式子,那么

[Fi,j11]×[a0b1]=[Fi,j1]

[Fi1,m1]×[c0d1]=[Fi,11]

显然,最后结果矩阵就等于:

[11]×([a0b1]m1×[c0d1])n1×[a0b1]m1

但是由于 1n,m101000000 ,我们需要一些优化

矩阵费马小定理#

对于矩阵:(a,b,p为常数)

[a0b1]

a1 时,显然有:

[a0b1]p1=[ap10b(a0+a1++ap2)1]

a,p 互质,则由费马小定理可得:

ap11(modp)

b(a0+a1++ap2)b1ap11ab00(modp)

所以就可以得到:

[a0b1]p1[1001](modp)

这样可以得到单位矩阵,性质十分优美

解法#

考虑利用矩阵费马小定理,实际上

[a0b1]m1=[a0b1](m1)mod(p1)

其中 p=109+7

这样我们只需要预处理出 (m1)mod(p1),(n1)mod(p1) 就行了

但是 a=1c=1 时要特判

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;
}

作者:Into_qwq

出处:https://www.cnblogs.com/into-qwq/p/16490097.html

版权:本作品采用「qwq」许可协议进行许可。

posted @   Into_qwq  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示