noip模擬賽 數列

2022-05-01 09:51:10 字數 1163 閱讀 6803

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

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

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

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

分析:dfs有30分,記憶化搜尋有60分,剩下40分要怎麼得到呢?求數列第n項可以用矩陣來優化.每乙個f(i) (i > 3)都能表示成a*f(1) + b*f(2) + c*f(3),利用矩陣相乘的定義,構造矩陣,由於不方便打出來,可以在紙上畫一下:

f(n)         1  0  1       f(n-1)

f(n-1)   =   1  0  0   *   f(n-2)

f(n-2)    0  1  0       f(n-3)

事實上我們只需要第二個矩陣的n-3次方就好了,結果就是所得矩陣第一行的三個數之和.

#include #include 

#include

#include

#include

using

namespace

std;

const

int mod = 1000000007

;long

long t,n,op[4][4],a[4][4],b[4][4

];long

long temp[4][4

],ans;

void

init()

void

mul1()

void

mul2()

intmain()

ans = (a[1][1] + a[1][2] + a[1][3]) %mod;

printf(

"%lld\n

", ans);}}

return0;

}

noip模擬賽 數列

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

NOIP模擬賽 數列

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。輸出格式 每行輸出乙個非負整數表示...

NOIP模擬賽 等差數列

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