HDU 2065 紅色病毒

2021-07-05 14:48:19 字數 1268 閱讀 6703

思路:

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(奇) +ac (偶)*3

=2*f(n-1)+4^(n-1)

綜上可得:g(n)=2*g(n-1)+2^(2*n-3)

利用迭代可以算出:

g(n)=2^(n-1)+2^(2*n-2)

由於題目上要求1<=n<2^64 是非常大的數 long long 也不可能將其完全儲存下來,於是考慮找末兩位的規律:

因為題目只要求輸出最後2位數,我們依次輸出2的n的最後兩位看看…

20 -> 1

21 -> 2

22 -> 4

23 -> 8

24 -> 16

25 -> 32

26 -> 64

27 -> 28

28 -> 56

29 -> 12

210 -> 24

211 -> 48

212 -> 96

213 -> 92

214 -> 84

215 -> 68

216 -> 36

217 -> 72

218 -> 44

219 -> 88

220 -> 76

221 -> 52

222 -> 4

到了222時,末尾2位又變成4,與22一樣,這時候就進入了乙個迴圈了(每20個一次迴圈)。

所以,結果只能是這22個中的乙個。只有n=0 和 n=1是需要特殊考慮的。其他n就等於2(n-2) % 20 + 2的值了。

code:

#include

#include

#include

using

namespace

std;

int main()

; while(cin>>t&&t)

cout

<}

}

hdu 2065 紅色病毒 問題

複習母函式,發現這道題可以用矩陣快速冪。然後做了一下 母函式 看起來好複雜的樣子 列dp方程,構造矩陣 dp n dp i 0 表示放到了第i位,前i位中有 偶數個a,有 偶數個c dp i 1 表示放到了第i位,前i位中有 奇數個a,有 偶數個c dp i 2 表示放到了第i位,前i位中有 偶數個...

hdu 2065 紅色病毒 問題

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

hdu2065 紅色病毒 問題

思路 先暴力打個表,然後找規律.include includeint main int b 5 4 int64 n,m while scanf d t eof t printf n return 0 description 醫學界發現的新病毒因其蔓延速度和internet上傳播的 紅色病毒 不相上下...