【背景】
眾所周知,鬱楊是乙個十分優秀的人,他每天都會用課餘時間想物理問題,以保持對物理火熱般地熱愛。也因此,他的物理成績每次都是95+。有一天我問他:「為什麼你這麼優秀?」,鬱楊紅了臉,很不好意思地對我說了一番話,看起來好像很萌的樣子,說完了我就傻了。
【問題描述】
原來鬱楊說:「成功無捷徑,我每次做題的時候會先規定這題最多想k秒,然後休息一下再想,你可以想像你想問題的時候就像在讀進度條,我每想s秒,那麼這個進度條就會前進s格,只要恰好到了進度條的終點n,那麼我就能把這題解決了!另外,多一秒都不行,要恰好n秒,不然腦子會壞掉的.」;
我:「。。。。」
給出k和n,求出鬱楊解決這道題有多少種姿勢d。
因為d可能很大所以只需輸出其mod 7777777之後的結果就可以了.
//看完樣例說明你就知道我在講什麼了,其中開始時進度條為0,所涉及到的計算都是整數。
【輸入格式】
輸入的第一行為k(1<=k<=10);
輸入的第二行為n(n<=2^31-1);
【輸出格式】
乙個整數,為鬱楊解決這道題的方案數 mod 7777777之後的結果.
【樣例輸入】
2 4
【樣例輸出】
5 【樣例說明】
一共有5種姿勢
(即最多想2秒,也就是說可以想1秒也可以想2秒,只要最後進度條恰好為4即可);
→1→2→3→4
→2→3→4
→2→4
→1→3→4
→1→2→4
【後話】
因為勤於思考鬱楊成就了自己的理想,獲得了人生的成功。
【題解】
顯然有遞推關係
f[n] = f[n-1]+f[n-2]+f[n-3]+…+f[n-k];
但是n巨大.
用迭代的方法雖然可以解決空間問題,但是時間還是會超的。
更優秀的辦法:
用矩陣乘法進行迭代.
構造乙個矩陣
以k = 3為例
[0
10] [f(n-3)] [f(n-2)][00
1] * [f(n-2)] = [f(n-1)] [11
1] [f(n-1)] [f(n)]
則
[0
10] [f(1)] [f(n-2)][00
1] ^(n-3)* [f(2)] = [f(n-1)] [11
1] [f(3)] [f(n)]
先處理出f[1..k]
然後處理出那個構造矩陣的(n-3)次方。然後就能夠快速獲得f(n)了;
因為n巨大,所以要用快速冪;
記得取模;
當時自己瞎編的背景,現在看到留下的就只有感動了,雖然當時有點幼稚,但很懷念。
#include
#include
#include
#define ll long long
using
namespace
std;
const
int maxk = 12;
const ll mod = 7777777;
struct abc
;abc temp = ,a;
int k,n;
ll f[maxk];
void input(int &r)
abc jc(abc a, abc b)//矩陣a左乘b
return c;
}abc ksm(int x)//矩陣快速冪
int main()
for (int i = 1; i <= k - 1; i++)
temp.jz[i][i+1] = 1;
for (int i = 1; i <= k; i++)
temp.jz[k][i] = 1;
a = ksm(n - k);
f[11] = 0;
for (int i = 1; i <= k; i++)
f[11] = (f[11]+a.jz[k][i]*f[i])%mod;
printf("%i64d\n", f[11]);
return
0;}
了不起的蓋茨比
這本書是在去長沙的飛機上面開始看的,起先知道這本書是由於小李子演的電影。之後買這本書是由於村上春樹。最近一直很喜歡村上,看過他的書的人都會被一種質樸和真實所吸引,我也不例外。看完之後給我感覺很縹緲,我不知道什麼是真正的成功,不知道什麼是真實的愛情。由於最近遇到一些事情,遇到了我一生都無法忘卻的事情。...
都是壓鬱惹的禍
今天跟著班裡的同學去 春遊 其實跟春天沒什麼關係,重點不在 春 這樣說可能還會讓人誤以為是遊蕩觀賞,其實也不是.只是吃喝玩.就是衝著玩去,大家一起上大學也三年了,光棍一堆,平時生活單調到不行了,班長眼看同學們都可能壓出病來了,其實如果是被美女壓出病來,倒是全中國男人的夢想,可是相反,等了三年,沒發現...
007 008 了不起的分支迴圈
in 是成員資格符 a in asdwrr true標題出處 魚c論壇 score int input 請輸入你的成績 while score 100 elif score 80 and score 60 print c elif score 90 and score 100 print a eli...