zoukankan      html  css  js  c++  java
  • 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人”

    “游戏继续。”

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

  • 相关阅读:
    简介支持向量机热门(认识SVM三位置)
    马云控股“中国文化”什么暗藏玄机?
    cocos2d-x 颜色
    饼干怪兽和APT攻击
    FindBugs:Compiler output path for module can not be null. check your module/project settings问题原因
    java传值和通过引用传递
    威佐夫博奕
    数据复制特定的代码:监视剪贴板和剪贴板内容到治疗后的剪贴板
    Opencv on Ubuntu (from Ubuntu)
    Hdu 4916 Count on the path
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5243088.html
Copyright © 2011-2022 走看看