問題描述
在乙個奇怪的星球上駐紮著兩個蟲群a和b,它們用奇怪的方式繁殖著,在t+1時刻a蟲群的數量等於t時刻a蟲群和b蟲群數量之和,t+1時刻b蟲群的數量等於t時刻a蟲群的數量。由於星際空間的時間維度很廣闊,所以t可能很大。overmind 想知道在t時刻a蟲群的數量對 p = 1,000,000,007.取餘數的結果。當t=1時 a種群和b種群的數量均為1。
輸入格式
測試資料報含乙個整數t,代表繁殖的時間。
輸出格式
輸出一行,包含乙個整數,表示對p取餘數的結果
樣例輸入
10
樣例輸出
89
樣例輸入
65536
樣例輸出
462302286
資料規模和約定
對於50%的資料 t<=10^9
對於70%的資料 t<=10^15
對於100%的資料 t<=10^18
思路:求斐波那契數列第n項,但是資料範圍太大,o(n)的時間複雜度會超時。
樸素的求斐波那契數列會超時
#include using這裡我們先引入複習一下快速冪模板namespace
std;
const
int mod = 1000000007
;typedef
long
long
ll;int
main()
cout
<< a <
return0;
}// 超時**
#include using這裡貼上新學習的矩陣快速冪的模板個人認為比較好理解一些namespace
std;
typedef
long
long
ll;ll mul(ll a, ll b, ll p)
return
ans ;
}int
main()
#include #include在求斐波那契數列 可以使用矩陣快速冪矩陣快速冪是用來求解遞推式的,所以第一步先要列出遞推式:#include
#include
using
namespace
std;
typedef
long
long
ll;const
int n = 105, mod = 1000000007
;int
n;ll k;
struct
mat inline
void build() //
建造單位矩陣
}mat;
mat
operator * (const mat &x, const mat &y) //
過載運算子
intmain()
for (int i = 1; i <= n; i ++)
return0;
}
f(n)=f(n-1)+f(n-2)
第二步是建立矩陣遞推式,找到轉移矩陣:
,簡寫成t * a(n-1)=a(n),t矩陣就是那個2*2的常數矩陣,而
這裡就是個矩陣乘法等式左邊:1*f(n-1)+1*f(n-2)=f(n);1*f(n-1)+0*f(n-2)=f(n-1);
所以這裡相乘就是矩陣n-1次相乘,然後輸出第一行第二個元素,也就是a[0][1];
把第乙個矩陣設為a,第二個矩陣設為b,第三個矩陣設為c。
總而言之 :最終斐波那契數列可以從矩陣中對應此公式
由 f2 f1 f1 f0 組成的矩陣的n次方 的左下角就是fn。
所以可以上**
注:此題和標準的斐波那契數列(1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, ...)有不同處
標準的即f0=0,f1=1,f2=1,f3=2 而此題中f1=1,f2=2
所以我們最後實則應該求f的n+1項
#include #include#include
#include
using
namespace
std;
typedef
long
long
ll;const
int mod = 1000000007
;ll n, k;
struct
mat inline
void
build()
}base
;mat
operator * (const mat &x, const mat &y)
intmain()
cout
<< ans.a[0][0] <
//cout << ans.a[1][0] << endl; 注意這一道題的f1=1 f2=2 和標準的斐波那契數列有一定區別
return0;
}
藍橋杯VIP試題 演算法訓練 奇異的蟲群
資源限制 時間限制 1.0s 記憶體限制 256.0mb 問題描述 在乙個奇怪的星球上駐紮著兩個蟲群a和b,它們用奇怪的方式繁殖著,在t 1時刻a蟲群的數量等於t時刻a蟲群和b蟲群數量之和,t 1時刻b蟲群的數量等於t時刻a蟲群的數量。由於星際空間的時間維度很廣闊,所以t可能很大。overmind ...
試題 演算法訓練 關聯矩陣
試題 演算法訓練 關聯矩陣 資源限制 時間限制 1.0s 記憶體限制 512.0mb 問題描述 有乙個n個結點m條邊的有向圖,請輸出他的關聯矩陣。輸入格式 第一行兩個整數n m,表示圖中結點和邊的數目。n 100,m 1000。接下來m行,每行兩個整數a b,表示圖中有 a,b 邊。注意圖中可能含有...
試題 演算法訓練 矩陣乘法
思路 定義乙個函式,實現矩陣的乘法,列印的時候,按行列印即可,詳看 資源限制 時間限制 1.0s 記憶體限制 512.0mb 問題描述 輸入兩個矩陣,分別是m s,s n大小。輸出兩個矩陣相乘的結果。輸入格式 第一行,空格隔開的三個正整數m,s,n 均不超過200 接下來m行,每行s個空格隔開的整數...