蒟蒻求助,WA了(base矩阵感觉没错啊)
  • 板块P5175 数列
  • 楼主无尽星空
  • 当前回复1
  • 已保存回复1
  • 发布时间2020/10/4 09:24
  • 上次更新2023/11/5 12:05:33
查看原帖
蒟蒻求助,WA了(base矩阵感觉没错啊)
179253
无尽星空楼主2020/10/4 09:24
#include<bits/stdc++.h>
#define LL long long
#define R register int
using namespace std;
LL n,t,p=1e9+7,a,b,x,y;
struct mat
{
	LL m[4][4];
	void init(int fm)
	{
		for(R i=0;i<4;i++)
			for(R j=0;j<4;j++)  m[i][j]=0;
		if(fm==1)  m[0][0]=m[2][1]=1,m[0][1]=m[1][1]=x*x%p,m[0][2]=m[1][2]=y*y%p,m[0][3]=m[1][3]=2*x*y%p,m[3][1]=x,m[3][3]=y;
		if(fm==2)  m[0][0]=(a*a+b*b)%p,m[1][0]=b*b%p,m[2][0]=a*a%p,m[3][0]=a*b%p;
	}
}base,ans;
mat mul(mat a,mat b)
{
	mat c;c.init(0);
	for(R i=0;i<4;i++)
		for(R k=0;k<4;k++)
			for(R j=0;j<4;j++)
				if(a.m[i][j]&&b.m[j][k])  c.m[i][k]=(c.m[i][k]+a.m[i][j]*b.m[j][k]%p)%p;
	return c;
}
inline LL read()
{
	LL s=0;char c=getchar();
	while(c<'0'||c>'9')  c=getchar();
	while(c>='0'&&c<='9')  s=s*10+c-'0',c=getchar();
	return s;
}
int main()
{
	t=read();
	while(t--)
	{
		n=read()-2,a=read(),b=read(),x=read(),y=read();
		base.init(1);ans.init(2);
		while(n)
		{
			if(n&1)  ans=mul(base,ans);
			n/=2;base=mul(base,base);
		}printf("%lld\n",ans.m[0][0]);
	}
	return 0;
}
2020/10/4 09:24
加载中...