NOIP模擬賽 數列

2022-05-16 06:13:08 字數 1029 閱讀 4144

problem 2 數列(seq.cpp/c/pas)

【題目描述】

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。

【輸出格式】

每行輸出乙個非負整數表示答案。

【樣例輸入】

【樣例輸出】

【資料範圍】

對於30%的資料 n<=100;

對於60%的資料 n<=2*10^7;

對於100%的資料 t<=100,n<=2*10^9;

看了乙個小時的矩陣快速冪。。。

難點主要在於推轉移矩陣

感謝wust_wenhao的資料,非常詳細

矩陣快速冪:

1

#define rep(i,j,k) for(int i=j;i<=k;i++)

2 #include3

using

namespace

std;45

const

int mod=1000000007;6

7struct

matrix8;

11matrix i,mat,zero;

12int

t,n;

1314

void

init()

1520

21matrix mult(matrix x,matrix y)

2228

29int modexp(int

x)30

38return (ret.d[2][0]+ret.d[2][1]+ret.d[2][2])%mod;39}

4041

int solve(int

x)42

4647

intmain()

4856

return0;

57 }

noip模擬賽 數列

分析 打個表,會發現a1,a2中較小的乙個數會出現很多次,把這些數刪掉,就會形成若干個等差數列,每個等差數列中新出現的數的個數是a1a2較大者除以較小者.之後取個餘,繼續做重複的操作就行了.include include include include using namespace std int...

noip模擬賽 數列

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 368 10 輸出樣例 1 4 919 對於...

NOIP模擬賽 等差數列

題目描述 麥克在第一張紙上寫下了n個十進位制實數。然後,對於每個實數,他都寫下了乙個從0開始,以該數為公差的等差數列。比如當前數為x,則他寫的等差數列為0,x,2x,3x,接下來,他把第一張紙上的所有在區間 a,b 中的數挑選出來,剔除掉重複的,按公升序寫在第二張紙上。但第二天,他把第一張紙弄丟了。...