HDOJ 2604 Queuing 解題報告

2022-05-07 16:48:14 字數 1538 閱讀 1722

a了這一題,學了不少東西,說說。

首先,題意是計算a[l]%m的值。而a[1]=2,a[2]=4,a[3]=6,a[4]=9。l的範圍比較誇張,[0,1000000]。

e-queues串的結尾必然是[1]:000,[2]:100,[3]:001,[4]:011,[5]:010,[6]:110

在長度為n-1的e-queues串加0或1,則

a[n][1]=a[n-1][1]+a[n-1][2]

a[n][2]=a[n-1][5]+a[n-1][6]

a[n][3]=a[n-1][1]+a[n-1][2]

a[n][4]=a[n-1][3]

a[n][5]=a[n-1][3]

a[n][3]=a[n-1][4]

按照這種方式,可以得到:a[n]=a[n-1]+a[n-3]+a[n-4]

得到遞推公式,一般來說就可以解決問題了,可是題目給的l範圍比較大。。。直接算a[n]幾乎不可能,很容易超時。

筆者想到這裡就卡住了,就在網上找了一下大牛的方法,發現都是用 二分快速冪 來做的。

矩陣是大一的時候學習的,至今沒怎麼用過,沒想到今天派上了用場。

二分快速冪,說的簡單一點,就是充分利用每一次的運算結果。例如計算a的n次方:

res=1

;while

(n)

常規的方法要計算n次,而二分的話,就可以只計算log2 n次。

或者說n=15,res=a^n=(a^8)*(a^4)*(a^2)*(a^1)。每一項都是下一項的平方,這就是2分的思想。

那這道題呢?我們可以構建乙個矩陣的式子:

[ a[n], a[n-1], a[n-2], a[n-3] ] = [ a[n-1], a[n-2], a[n-3], a[n-4] ]*[ [1, 0, 1, 1]t, [ 1, 0, 0, 0 ]t, [ 0, 1, 0, 0 ]t, [ 0, 0, 1, 0 ]t ]

額。。。確實很難看,筆者也沒辦法,意思就是這個意思。t是轉置的意思。

根據遞推式,可以得到:

[ a[n], a[n-1], a[n-2], a[n-3] ] = [ a[4], a[3], a[2], a[1] ]*[ [1, 0, 1, 1]t, [ 1, 0, 0, 0 ]t, [ 0, 1, 0, 0 ]t, [ 0, 0, 1, 0 ]t ]^(n-4)

對矩陣n-4進行二分快速冪的運算,運算過程中模m,可以很快得到結果。下面是筆者的ac**:

#include using

namespace

std;

const

int len=4

;int

m;struct

matrix

original,result;

matrix mul(matrix &a, matrix &b)

returnc;}

intmain()

;

while(cin>>n>>m)

for(i=0;i)

cout}}

}

哈哈,it小男孩原創~

HDU2604 Queuing 遞推 矩陣快速冪

題目鏈結 題意 男為f,女為m,求在長度為l的佇列中不存在fmf,fff這樣子序列的序列的個數。思路 又是遞推題,假設長度為l的佇列中存在的序列個數為f l 那麼考慮最後乙個放的字母,假設最後乙個放m,那麼前l 1個可以隨意排列,即個數為f l 1 如果最後乙個放f,那麼考慮後兩個字母,可能出現的情...

HDU 2604 Queuing 矩陣快速冪

題目大意 有2 l個長度為l的字串,字串只能有f或m組合而成,問這些字串中不含有fmf或著fff的字串有多少個 解題思路 設f n 為字串長度為n,且字串中不包含fmf或者fff的字串個數 假設現在填到第n位了,最後乙個字元如果填的是m的話,那麼f n 1 的都可以填 最後一位填的如果是f的話,這就...

HDU 2604 Queuing 矩陣快速冪

大意 一列人有mf 男,女 問最後不是fmf和fff的排列方式有多少種。思路 就是個遞推,類似推骨牌從最後一位來考慮,ps骨牌 最後的牌排列方式有橫著或者豎著,豎著的話有f n 1 中,否則橫著就是f n 2 此題也是當最後為m有f n 1 當為f時不確定看兩位mf,ff 所以最終的表示式就是f n...