【CODEVS3332】数列

Description

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

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

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

Input

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

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

Output

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

Sample Input

3

6

8

10

Sample Output

4

9

19

HINT

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

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

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

 

#include<iostream>
#include<cstring>
using namespace std;
void mul(long long a[3][3],long long b[3][3])
{
    long long c[3][3];
    memset(c,0,sizeof(c));
    for (int i=0;i<3;i++)
        for (int j=0;j<3;j++)
            for (int k=0;k<3;k++)
                c[i][j] = (c[i][j]+a[i][k]*b[k][j]) % 1000000007;
    memcpy(a,c,sizeof(c));
}
int main()
{
    int T,x;
    cin>>T;
    for (int i=1;i<=T;i++)
    {
        long long a[3][3]={{0,0,1},{1,0,0},{0,1,1}};
        long long f[3][3]={{1,1,1},{0,0,0},{0,0,0}};
        cin>>x;
        x-=1; //因为第一个数存在了,所以计算次数-1 
        while (x>0)
        {
            if (x&1) mul(f,a);
            mul(a,a);
            x>>=1;
        }
        cout<<f[0][0]<<endl;
    }
    return 0;
}

 

你可能感兴趣的:(【CODEVS3332】数列)