Mnzn求助矩阵快速幂WA20pts
查看原帖
Mnzn求助矩阵快速幂WA20pts
716099
lovely_hyzhuo楼主2023/11/12 16:59

rt,AC#8,#11,#1

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3;
int mod=1e9+7;
struct mat
{
	int n,m;
	long long v[N][N];
	mat()
	{
		memset(v,0,sizeof(v));
	}
};
mat mul(mat a,mat b)
{
	mat c;
	c.n=a.n,c.m=b.m;
	for(int i=1;i<=c.n;i++)
		for(int j=1;j<=c.m;j++)
		{
			long long cnt=0;
			for(int k=1;k<=a.m;k++)
				cnt=(cnt+a.v[i][k]*b.v[k][j])%mod;
			c.v[i][j]=cnt;
		}
	return c;
}
mat pw(mat A,int k)
{
	mat ret;
	ret.n=A.n,ret.m=A.m;
	for(int i=1;i<=ret.n;i++)
		ret.v[i][i]=1;
	while(k)
	{
		if(k&1)ret=mul(ret,A);
		A=mul(A,A);
		k/=2;
	}
	return ret;
}
signed main()
{
	int t=1;
	int n,a1,a2,p,q;
	cin>>p>>q>>a1>>a2>>n>>mod;
	mat a,b;
	a.n=a.m=2;
	b.n=1,b.m=2;
	b.v[1][1]=a2,b.v[1][2]=a1;
	a.v[1][1]=q,a.v[1][2]=p;
	a.v[2][1]=1;
	while(t--)
	{
		if(n==2)
		{
			cout<<a2<<endl;
			continue;
		}
		if(n==1)
		{
			cout<<a1<<endl;
			continue;
		}
		mat c=mul(b,pw(a,n-2));
		int ans=(c.v[1][1]+c.v[2][1])%mod;
		cout<<ans<<endl;
	}
	return 0;
}
2023/11/12 16:59
加载中...