全T求助
  • 板块P5175 数列
  • 楼主吕航
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/5/28 08:41
  • 上次更新2023/10/23 14:31:28
查看原帖
全T求助
219429
吕航楼主2023/5/28 08:41
#include<bits/stdc++.h>
using namespace std;
inline void read(long long &n){
	char ch;
	long long x=0,f=1;
	for(ch=getchar();!(ch>='0'&&ch<='9')&&ch!='-';ch=getchar());
	if(ch=='-')
	{
		f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=(x<<3)+(x<<1)+ch-'0';
		ch=getchar();
	}
	n=x*f;
}
const int mod=1000000007;
long long n;
struct mul
{
	long long a[105][105];
	mul()
	{
		memset(a,0,sizeof a);
	}
	inline void bulid()
	{
		for(int i=1;i<=n;i++) a[i][i]=1;
	}
}ans,a;
mul operator *(const mul &x,const mul &y)
{
	mul z;
	for(int k=1;k<=4;k++)
	{
		for(int i=1;i<=4;i++)
		{
			for(int j=1;j<=4;j++)
			{
				z.a[i][j]=(z.a[i][j]+x.a[i][k]*y.a[k][j])%mod;
			}
		}
	}
	return z;
}
mul operator +(const mul &x,const mul &y)
{
	mul z;
	for(int k=1;k<=4;k++)
	{
		for(int i=1;i<=4;i++)
		{
			for(int j=1;j<=1;j++)
			{
				z.a[i][j]=(z.a[i][j]+x.a[i][k]*y.a[k][j])%mod;
			}
		}
	}
	return z;
}
void pr(mul a)
{
	for(int i=1;i<=4;i++)
	{
		for(int j=1;j<=4;j++)
		{
			printf("%lld ",a.a[i][j]);
		}
		printf("\n");
	}
}
int main()
{
	long long T;
	read(T);
	for(int _=1;_<=T;_++)
	{
		long long x,y,a1,a2;
		read(n);read(a1);read(a2);read(x);read(y);
		a.a[1][1]=1;a.a[1][2]=1;a.a[1][3]=0;a.a[1][4]=0;
		a.a[2][1]=0;a.a[2][2]=x*x%mod;a.a[2][3]=y*y%mod;a.a[2][4]=2*x*y%mod;
		a.a[3][1]=0;a.a[3][2]=1;a.a[3][3]=0;a.a[3][4]=0;
		a.a[4][1]=0;a.a[4][2]=x;a.a[4][3]=0;a.a[4][4]=y;
		ans.a[1][1]=a1*a1%mod;
		ans.a[2][1]=a2*a2%mod;
		ans.a[3][1]=a1*a1%mod;
		ans.a[4][1]=a1*a2%mod;
		n--;
		do
		{
			if(n&1) ans=a+ans;
			a=a*a;
			n>>=1;
		}while(n);
		printf("%lld\n",ans.a[1][1]);
	}
	return 0;
}
2023/5/28 08:41
加载中...