CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂 中二版

“问题:众所周知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人”

“游戏继续。”

依旧是那冰冷的声音,不过格外温暖。

原文地址:https://www.cnblogs.com/qscqesze/p/5243088.html