P5175 数列

题目描述

一个数列a_nan​,已知a_1a1​及a_2a2​两项。

数列a_nan​满足递推式\large a_n=x \times a_{n-1}+ y \times a_{n-2}(n\geq3).​

\large \sum_{i=1}^na_i^2

由于答案可能过大,对\large 10^{9}+7取模。

输入样例#1: 复制

3
5 1 1 1 1
4 3 4 3 2
461564597527246 987489553 321654648 164165256 315648984

输出样例#1: 复制

40
4193
480929868

说明

样例解释:

对于第一组样例,可知数列为1,1,2,3,5则答案是1^2+1^2+2^2+3^2+5^2=40

对于第二组样例,可知数列为3,4,18,62则答案是3^2+4^2+18^2+62^2=4193

对于前20%的数据,保证x=y=1

对于100%的数据,T=30000,1\le n \le 10^{18},1\le a_1,a_2 ,x,y \le 10^9

要注意取模的问题!到处都要取模!到处都要取模!到处都要取模!

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

猜你喜欢

转载自blog.csdn.net/ffscas/article/details/88071322