思路:
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上傳播的 紅色病毒 不相上下...