神秘植物
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 #includeview code3 #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 }
快速冪(矩陣快速冪)
求 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...