2065 hdu 紅色病毒 快速冪

2021-07-25 02:27:37 字數 2740 閱讀 7059

問題分析

problem analyse 遞推題

algorithm analyse 比起以前做過的遞推題,這一題算比較麻煩的了(當然,原因是我沒有想到

因為有了a、c需要出現偶數次的要求,就出現合法和不合法的不同分組。

在不合法的組裡,又有

1.a出現奇數次、c出現偶數次;

2.c出現奇數次、a出現偶數次;

3.a出現奇數次、c出現奇數次;

三種情況。

我們用陣列

f[n][0]儲存長度為n,合法的字串的個數。

f[n][1]儲存長度為n,僅a出現奇數次的字串的個數。

f[n][2]儲存長度為n,僅c出現奇數次的字串的個數。

f[n][3]儲存長度為n,a、c出現奇數次的字串的個數。

f[n][0]

長度為n-1的合法字串在末尾加上乙個b或者d,都可以變成長度為n的合法字串。

長度為n-1的僅a出現奇數次的字串再在末尾加上乙個a,也可以變成合法字串。

長度為n-1的僅c出現奇數次的字串再在末尾加上乙個c,也可以變成合法字串。

所以,f[n][0] = 2 × f[n-1][0] + f[n-1][1] + f[n-1][2];

f[n][1]

長度為n-1的合法字串在末尾加上a,都可以變成長度為n的僅a出現奇數次的字串。

長度為n-1的僅a出現奇數次的字串再在末尾加上乙個b或者d,也可以變成僅a出現奇數次的字

符串。長度為n-1的a、c出現奇數次的字串再在末尾加上乙個c,也可以變成僅a出現奇數次的字串

。所以,f[n][1] = 2 × f[n-1][1] + f[n-1][0] + f[n-1][3];

f[n][2]

長度為n-1的合法字串在末尾加上c,都可以變成長度為n的僅c出現奇數次的字串。

長度為n-1的僅c出現奇數次的字串再在末尾加上乙個b或者d,也可以變成僅c出現奇數次的字

符串。長度為n-1的a、c出現奇數次的字串再在末尾加上乙個a,也可以變成僅c出現奇數次的字串

。所以,f[n][2] = 2 × f[n-1][2] + f[n-1][0] + f[n-1][3];

f[n][3]

長度為n-1的a、c出現奇數次的字串在末尾加上一b或者d,都可以變成長度為n的a、c出現奇數

次的字串。

長度為n-1的僅a出現奇數次的字串再在末尾加上乙個c,也可以變成a、c出現奇數次的字串

。長度為n-1的僅c出現奇數次的字串再在末尾加上乙個a,也可以變成a、c出現奇數次的字串

。所以,f[n][3] = 2 × f[n-1][3] + f[n-1][1] + f[n-1][2];

綜上所述,我們得到:

f[n][0] = 2 × f[n-1][0] + f[n-1][1] + f[n-1][2]; ①

f[n][1] = 2 × f[n-1][1] + f[n-1][0] + f[n-1][3]; ②

f[n][2] = 2 × f[n-1][2] + f[n-1][0] + f[n-1][3]; ③

f[n][3] = 2 × f[n-1][3] + f[n-1][1] + f[n-1][2]; ④

f[1][0] = 2

f[1][1] = 1

f[1][2] = 1

f[1][3] = 0

/**** 搞出這個我就很哈皮的去敲快速冪了。。。然而大牛。。。 ****/

發現f[1][1]與f[1][2]初始狀態相同,而且以後迭代方程也相同,所以f[n][1] = f[n][2]

又有f[n][0] + f[n][3] = f[n][1] + f[n][2]

∵f[n][0] + f[n][1] + f[n][2] + f[n][3] = 4^n

∴f[n][0] + f[n][3] = f[n][1] + f[n][2] = 2 × 4^(n-1)

∴f[n-1][1] + f[n-1][2] = 2 × 4^(n-2)

∴f[n][0] = 2 × f[n-1][0] + f[n-1][1] + f[n-1][2] = 2 × f[n-1][0] + 2 × 4^(n-2)

我們得到:

f[n][0] = 2 × f[n-1][0] + 2^(2n-3)

f[n-1][0] = 2 × f[n-2][0] + 2^(2n-5)

┋f[n-m][0] = 2 × f[n-m-1][0] + 2^(2n-2m-3)

┋f[2][0] = 2 × f[1][0] + 2^1

f[1][0] = 2

開始一層層往下迭代:

f[n][0]

= 2 × f[n-1][0] + 2^(2n-3)

= 2^2 × f[n-2][0] + 2^(2n-4) + 2^(2n-3)

┋= 2^m × f[n-m][0] + 2^(2(n-m)-1+m-1) + … + 2^(2n-3)

= 2^(n-1) × f[1][0] + 2^(n-1) + 2^n +… + 2^(2n-3)

f[1][0] = 2;

∴f[n][0] = 2^n + 2^(n-1) + 2^n +… + 2^(2n-3) = 2^(2n-2) + 2^(n-1)

#includeint pow(__int64 n)  

return r;

} int main()

printf("\n");

} return 0;

}

快速冪 HDU2065 紅色病毒 問題

problem description 醫學界發現的新病毒因其蔓延速度和internet上傳播的 紅色病毒 不相上下,被稱為 紅色病毒 經研究發現,該病毒及其變種的dna的一條單鏈中,胞嘧啶,腺嘧啶均是成對出現的。現在有一長度為n的字串,滿足一下條件 1 字串僅由a,b,c,d四個字母組成 2 a出...

HDU2065 紅色病毒 問題(矩陣快速冪)

題意 中文題,不再描述。分析 參考這篇部落格,寫的非常好,我也是看的的。個人理解 我把原文的狀態轉移方程又補充了一下。為0是因為下乙個狀態不能由當前狀態得到。然後提取出係數得到矩陣 const matrix p 接下來就是然後建立乙個矩陣乘法函式 matrix multi const matrix ...

HDU 2065 紅色病毒

思路 a c a c a c 奇偶 奇奇 奇 偶奇 偶偶 偶 設a 偶 c 偶 的方法數為g n 則 g n ac 偶偶 ac 偶偶 ac 奇偶 ac 偶奇 由於對稱可知 ac 奇偶 ac 偶奇 故 g n 2 ac 偶 令ac 偶 f n 則g n 2 f n 1 下面討論f n f n ac 奇...