题目描述
一个数列a_nan,已知a_1a1及a_2a2两项。
数列a_nan满足递推式
求
由于答案可能过大,对取模。
输入样例#1: 复制
3 5 1 1 1 1 4 3 4 3 2 461564597527246 987489553 321654648 164165256 315648984
输出样例#1: 复制
40 4193 480929868
说明
样例解释:
对于第一组样例,可知数列为则答案是
对于第二组样例,可知数列为则答案是
对于前20%的数据,保证。
对于100%的数据,,
要注意取模的问题!到处都要取模!到处都要取模!到处都要取模!
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<map>
#include<stack>
#include<string>
#include<algorithm>
#include<cmath>
#define rg register
#define il inline
using namespace std;
typedef unsigned long long ll;
ll read(){
ll ans=0,flag=1;char ch;
while((ch=getchar())<'0'||ch>'9') if(ch=='-') flag=-1;
ans=ch^48;
while((ch=getchar())>='0'&&ch<='9') ans=(ans<<3)+(ans<<1)+(ch^48);
return flag*ans;
}
void WRI(ll x){
if(x<0){putchar('-');x=-x;}
if(x>9) WRI(x/10);
putchar(x%10+'0');
}
const ll mod=1e9+7;
void write(ll x,char o){WRI(x),putchar(o);}
struct matrix{
ll val[4][4];
};
matrix mul(matrix a,matrix b){
matrix ans;
for(rg int i=0;i<4;i++){
for(int j=0;j<4;j++){
ans.val[i][j]=0;
for(int k=0;k<4;k++)
ans.val[i][j]=(ans.val[i][j]+(a.val[i][k]*b.val[k][j])%mod )%mod;
}
}return ans;
}
matrix fastpow(matrix a,ll b){
matrix ans;
for(rg int i=0;i<4;i++){for(rg int j=0;j<4;j++){if(i==j)ans.val[i][j]=1;else ans.val[i][j]=0;}}
while(b){
if(b&1) ans=mul(ans,a);
b>>=1;
a=mul(a,a);
}return ans;
}
int main(){
int t=read();
while(t--){
ll n=read(),a1=read(),a2=read(),x=read(),y=read();
matrix standard={1,1,0,0,0,(x*x)%mod,(y*y)%mod,(2*x*y)%mod,0,1,0,0,0,x,0,y},tem;
tem=fastpow(standard,n-1);
ll sn=(a1*a1)%mod,a12=(a1*a1)%mod,a22=(a2*a2)%mod,a21=(a2*a1)%mod;
cout<<((((sn*tem.val[0][0])%mod+(tem.val[0][1]*a22)%mod)%mod +(tem.val[0][2]*a12)%mod)%mod+(tem.val[0][3]*a21)%mod)%mod<<endl;
}
return 0;
}