原文地址:http://www.cnblogs.com/qscqesze/p/5243088.html
“问题:众所周知772002很喜欢马尾,所以他决定画几幅马尾送给他的女朋友。
772002会画m种马尾,772002还有n张纸,n张纸分别编号1到n,每张纸上只能画一种马尾。
然而772002的女朋友只喜欢其中t种马尾。并且772002的女朋友只喜欢偶数(因为这象征着成对成双)。
772002想知道有多少种画法,使得n张纸画满并且自己女朋友喜欢的那t种马尾每种个数都恰好为偶数。
然而772002陪女朋友看电影去了,所以他把这个问题交给了你,你能解决吗?
m≤10,t≤m,n≤1000000000 ”
我呆呆的看着拿着神签,不知所措。
“别慌,冷静一下。正如潘星霖所讲:既然是题,那就一定能够做出来的。我们会和你一起想的。”沈柯静静的说道。
说的很有道理,但是这有什么用呢,我也想……
“我有一个简单的做法。”蹲在一旁的小郭,颤颤抖抖地举起了她的右手。
“我暴力枚举每张纸上画的是哪种马尾,然后枚举完之后,再进行检查是不是合法的就好了,这样应该就能得出答……”
“显然不行。”杨宇同还没等小郭说完,就马上就给出了回复,“这样的时间复杂度太高,根本不可能在有效时间内计算出来。”
......
又陷入了死一样的沉寂,只剩下风吹过的声音,就似鬼魂般游荡。
......
“换一个思路?”张冠澜突然说道,“我们可以令dp[i][j]表示画到第i张纸,现在t种马尾中有奇数种的个数为j的方案数。”
沈柯仿佛想到了什么,接着张冠澜说道:“恩,这个思路很好,这个dp的转移就是dp[i][j] = dp[i-1][j-1]*(t-j+1) + dp[i-1][j]*(m-t) + dp[i-1][j+1]*(j+1)。而最后的答案就是dp[n][0]。”
杨宇同补充道:“这样的时间复杂度是O(n*t)的,但是这道题要求n≤1000000000,时间仍然还是不允许,这该怎么办呢?”
一定是哪儿我们都没想到!
......
加油,我们一定想得出的,只差最后一步了。
大家仿佛都这样想着,都紧闭着双眼,思索着……
咦,好像我发现了什么,这个dp转移的时候,只和上一回合有关,而且貌似每次转移的方法都一模一样!
但是这个有什么用呢?
继续想想想。
......
“矩阵!”
“刚才那个式子,其实就是一个t*t大小的矩阵的连乘!”
“举一个例子,当t=4的时候,这个矩阵应该是什么样的呢?
然后这个矩阵的n次方的第一行第一列的第一个数就是答案!
但是,现在又有一个问题来了,如何快速求一个矩阵的n次方呢?”
“快速幂!”大家异口同声的说道。
“和潘星霖说的做法一样,我们只需要log的时间内,就能求出矩阵的n次方出来!”
“没错!”
......
仿佛这道题就解决了?
爽!
“快去,快去向系统说你的答案!时间不多了!”,张冠澜立马冲了过来,大力的将我推向了神签面前!
......
“回答正确。”
“剩余人数:8人”
“游戏继续。”
依旧是那冰冷的声音,不过格外温暖。