hlg神秘植物 矩陣快速冪

2022-05-19 01:54:50 字數 2186 閱讀 6896

神秘植物

time limit: 1000 ms

memory limit: 65536 k

total submit: 42(20 users)

total accepted: 20(16 users)

rating:

special judge: no

description

leyni

有一種神秘的植物,形狀是一種「向上」三角形植物,每過一年,每個「向上」三角形植物會變成三個「向上」三角形植物和乙個「向下」三角形植物,每個「向下」三角形植物會變成三個「向下」三角形植物和乙個「向上」三角形植物。如下圖:

想知道經過

n年有多少個「向上」三角形植物。

input

輸入包含多組測試資料。

對於每組測試資料:第1

行,包含乙個整數

n(0 ≤ 

n≤ 1018)

處理到檔案結束

output

對於每組測試資料:第1

行,輸出

leyni

擁有多少個「向上」三角形植物。

(mod 1000000007)

sample input12

sample output310

author

齊達拉圖@hrbust

大意:思路:

初看這個題以為是找規律,

結果還真找到了規律,不過由於數量級太大 所以用矩陣快速冪來解決

而乙個向上的可以得到3個向上的和1個向下的

乙個向下的可以得到1個向上的和3個向下的

所以   :第i個圖形  向上的三角形的個數  =  第i-1個圖形 向上的三角形的個數*3   +   第i-1個圖形 向下的三角形的個數*1

**:

1 #include 2 #include 

3 #include 4

using

namespace

std;56

const

int mod=1000000007;7

8long

long

int xx[2][2]=,

10

11};

1213

long

long

int start[1][2]=;

16//

2 2 * 2 2

17void mul1(long

long

int a[2][2],long

long

int b[2][2],long

long

int c[2][2

])1829}

30}31}

3233

//1 2 * 2 2

34void mul2(long

long

int a[1][2],long

long

int b[2][2],long

long

int c[1][2

])3546}

47}48}

4950

//diguui

5152

void cal(long

long

int x,long

long

int a[2][2

])5364}

65return;66

}67if(x%2==0)68

72else

if(x%2==1)73

77}7879

intmain()

8089

if(n==1)90

94long

long

int mid[2][2

];95

long

long

int end[1][2

];96 cal(n-1

,mid);

97mul2(start,mid,end);

98 printf("

%lld\n

",end[0][0

]);99

}100

return0;

101 }

view code

快速冪(矩陣快速冪)

求 3 0 3 1 3 n mod 1000000007 input 輸入乙個數n 0 n 10 9 output 輸出 計算結果 sample input 3sample output 40 分析 利用等比數列的求和公式得所求和是 3 n 1 1 2,如果暴力求3 n 1 會超時,這裡引入快速冪來...

快速冪 矩陣快速冪

快速冪 正常情況下求乙個數的冪時間複雜度為o n 而快速冪能把時間複雜度降到o logn 舉個例子 求5的13次方 思想首先把13化為二進位制 1101,即13 1101 8 1 4 1 2 0 1 1 即5 13 58 1 54 1 52 0 5 1 15 5 8 1 5 4 1 5 2 0 5 ...

快速冪 矩陣快速冪

快速冪 我們求a ba b ab最直接的方法就是把a乘b次這樣的話複雜度就是o n o n o n 但是在比賽時面對1e9的資料時還是會輕鬆超時的,此時就需要一種更快的乘法來幫助我們 我們把b拆成二進位制的形式得到a ba b ab a 10.01 a a1 0.01此時對b分解得到的序列10.01...