資源限制
時間限制:1.0s 記憶體限制:256.0mb
問題描述
在乙個奇怪的星球上駐紮著兩個蟲群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
思路:本題如果用常規的做法,輸入時間一直遍歷,時間到了之後對1000000007取餘輸出,那只有乙個結果,就是數字太大導致超時。
那麼仔細看看這道題發現他的規律與斐波那契數列一樣,所以我們可以用快速冪矩陣的方法對其求解,可以大大減少執行的時間。我們看看如何用矩陣求解,斐波那契數列公式為fn=fn-1+fn-2,如何用fn-1、fn-2乘以乙個矩陣得到fn,我們看看這個:
上面可以定義乙個矩陣為,每次相乘可得下一次的結果,為了減少時間,必須記錄每次計算的值,比如2*2=4為四次冪,也相當於計算了四次,比如當時間為9,即計算第一次變成平方,記錄下來,二次計算為四次方,三次為八次方,再乘以原來的一次即為九次,原本需要計算八次的四次計算就可以了。而在這當中需要考慮偶數和奇數的情況,這與另外乙個題矩陣乘方的做法一樣(我的部落格中這篇文章進行了說明,這裡就不多說了),如果為2的冪方的可以直接進行計算,不是2的冪方的就得另外做考慮,所以此題用矩陣的快速冪做法可以解決常規做法執行超時的問題,也能讓我們加深對這種方法的理解。
**如下:
#include
#include
using
namespace std;
voidks(
long
long a1[2]
[2],
long
long b1[2]
[2])
}}memcpy
(a1,c,
sizeof
(c));}
intmain()
,b[2][
2]=;
cin>>t;
while
(t>0)
ks(a,a)
; t/=2
;//有些做法將t%2==1為n&1,t/2為t>>=1與本題中計算結果一樣
} cout<
[0]%
1000000007
;}
藍橋杯VIP試題 演算法訓練 最大獲利
資源限制 時間限制 1.0s 記憶體限制 256.0mb 問題描述 chakra是一位年輕有為的企業家,最近他在進軍餐飲行業。他在各地開拓市場,共買下了n個飯店。在初期的市場調研中,他將一天劃分為m個時間段,並且知道第i個飯店在第j個時間段內,會有aij位服務員當值和bij位客戶光臨。他還分析了不同...
藍橋杯VIP試題 演算法訓練 比賽安排
資源限制 時間限制 1.0s 記憶體限制 512.0mb 問題描述 設有有2 n n 6 個球隊進行單迴圈比賽,計畫在2 n 1天內完成,每個隊每天進行一場比賽。設計乙個比賽的安排,使在2 n 1天內每個隊都與不同的對手比賽。輸入格式 輸入檔案matchplan.in共一行,輸入n的數值。輸出格式 ...
藍橋杯VIP試題 演算法訓練 排列問題
資源限制 時間限制 1.0s 記憶體限制 512.0mb 問題描述 求乙個0 n 1的排列 即每個數只能出現一次 給出限制條件 一張n n的表,第i行第j列的1或0,表示為j 1這個數不能出現在i 1這個數後面,並保證第i行第i列為0 將這個排列看成乙個自然數,求從小到大排序第k個排列。資料規模和約...