您的位置:首页 > 其它

P1939 【模板】矩阵加速(数列)

2018-02-07 19:13 363 查看

题目描述

a[1]=a[2]=a[3]=1

a[x]=a[x-3]+a[x-1] (x>3)

求a数列的第n项对1000000007(10^9+7)取余的值。

输入输出格式

输入格式:

第一行一个整数T,表示询问个数。

以下T行,每行一个正整数n。

输出格式:

每行输出一个非负整数表示答案。

输入输出样例

输入样例#1:

3
6
8
10


输出样例#1:

4
9
19


说明

对于30%的数据 n<=100;

对于60%的数据 n<=2*10^7;

对于100%的数据 T<=100,n<=2*10

Solution:



代码:

#include<bits/stdc++.h>
#define il inline
#define ll long long
//#define debug printf("%d %s\n",__LINE__,__FUNCTION__)
using namespace std;
const int mod=9907;
int t,n;
il int gi()
{
int a=0;char x=getchar();bool f=0;
while((x<'0'||x>'9')&&x!='-')x=getchar();
if(x=='-')x=getchar(),f=1;
while(x>='0'&&x<='9')a=a*10+x-48,x=getchar();
return f?-a:a;
}
struct mat{
int a[5][5],r,c;
};
il mat mul(mat x,mat y)
{
mat p;
memset(&p,0,sizeof(p));
for(int i=0;i<x.r;i++)
for(int j=0;j<y.c;j++)
for(int k=0;k<x.c;k++)
p.a[i][j]=(p.a[i][j]+x.a[i][k]*y.a[k][j])%mod;
p.r=x.r;p.c=y.c;
return p;
}
il void fast(int k)
{
mat p,ans;
memset(&p,0,sizeof(p));
memset(&ans,0,sizeof(ans));
p.r=p.c=3;
p.a[0][1]=p.a[1][2]=p.a[2][0]=p.a[2][1]=1;
ans.r=ans.c=3;
ans.a[0][0]=ans.a[1][1]=ans.a[2][2]=1;
while(k){
if(k&1)ans=mul(p,ans);
p=mul(p,p);
k>>=1;
}
p.a[0][0]=1,p.a[1][0]=2,p.a[2][0]=3;
p.c=1;
ans=mul(ans,p);
printf("%d\n",(int)ans.a[2][0]);
}
int main()
{
t=gi();
while(t--){
n=gi();
if(n<4)printf("%d\n",n);
else fast(n-3);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: