HDU打怪公升級之 紅色病毒 問題 2065

2021-08-26 12:07:32 字數 2596 閱讀 1956

醫學界發現的新病毒因其蔓延速度和internet上傳播的"紅色病毒"不相上下,被稱為"紅色病毒",經研究發現,該病毒及其變種的dna的一條單鏈中,胞嘧啶,腺嘧啶均是成對出現的。

現在有一長度為n的字串,滿足一下條件:

(1) 字串僅由a,b,c,d四個字母組成;

(2) a出現偶數次(也可以不出現);

(3) c出現偶數次(也可以不出現);

計算滿足條件的字串個數.

當n=2時,所有滿足條件的字串有如下6個:bb,bd,db,dd,aa,cc.

由於這個資料肯能非常龐大,你只要給出最後兩位數字即可.

每組輸入的第一行是乙個整數t,表示測試例項的個數,下面是t行資料,每行乙個整數n(1<=n<2^64),當t=0時結束.

對於每個測試例項,輸出字串個數的最後兩位,每組輸出後跟乙個空行.41

420113

142460

case 1:  2

case 2:  72

case 3:  32

case 4:  0

case 1:  56

case 2:  72

case 3:  56

根據問題可知道a、c只能出現偶數次,於是分別假設下面幾種情況:

1、f[n][0]表示長度為n的合法字串的數量

2、f[n][1]表示長度為n、僅a出現次數為奇數次的字串數量

3、f[n][2]表示長度為n、僅c出現次數為奇數次的字串數量

4、f[n][3]表示長度為n、a和c出現次數都為奇數次的字串數量

對於第一種f[n][0]的情況,其可以表示為f[n-1][0]加上b或d、f[n-1][1]加上a、f[n-1][2]加上c。

對於第二種f[n][1]的情況,其可以表示為f[n-1][0]加上a、f[n-1][1]加上b或d、f[n-1][3]加上c。

對於第三種f[n][2]的情況,其可以表示為f[n-1][0]加上c、f[n-1][2]加上b或d、f[n-1][3]加上a。

對於第四種f[n][3]的情況,其可以表示為f[n-1][1]加上c、f[n-1][2]加上a、f[n-1][3]加上b或d。

則根據上面所述可以得到下列公式:

1. f[n][0] = f[n-1][0]*2 + f[n-1][1] + f[n-1][2]

2. f[n][1] = f[n-1][1]*2 + f[n-1][0] + f[n-1][3]

3. f[n][2] = f[n-1][2]*2 + f[n-1][0] + f[n-1][3]

4. f[n][3] = f[n-1][3]*2 + f[n-1][1] + f[n-1][2]

假設沒有任何限制條件,則a、b、c、d組成的長度為n的字串數量為4^n。其剛好包括上面描述4中,於是可以得到

f[n][0]+f[n][1]+f[n][2]+f[n][3]=4^n。根據上面的4個公式可以得到 f[n][0]+f[n][3] = f[n][1] + f[n][2]。於是得到 f[n][1] + f[n][2] = 4^n/2。所以 f[n-1][1] + f[n-1][2] = 4^(n-1)/2 = 2*4^(n-2)。

綜上可以得到 f[n][0]  = f[n-1][0]*2 + 2*4^(n-2)。

則可以得到:

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

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

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

……f[2][0]    = f[1][0]*2    +  2*4^0

f[1][0]    = 2

通過迭代可以求得

f[n][0]    =  2^(n-1)*f[1][0] + 2^(n-1)*4^0 + 2^(n-2)*4+…+2^(n-m)*4^(m-1)+…+2*4^(n-2)

=  2^n + 2^(n-1) + 2^n + 2^(n+1)+... + 2^(n+m-1)+...+2^(2n-3)

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

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

由於題目中的n的範圍為1<=n<2^64,如果帶入上式則不能夠得到結果。但題目只要求輸入結果的最後2位數,所以考慮一下2的n次方的最後兩位數:

2^0=1、2^1=2、2^2=4、2^3=8、2^4=16、2^5=32、2^6=64、2^7=28、2^8=56、2^9=12、2^10=24、2^11=48、2^12=96、2^13=92、2^14=84、2^15=68、2^16=36、2^17=72、2^18=44、2^19=88、2^20=76、2^21=52、2^22=4。

可以知道2^22與2^2相等,所以從2^2開始每20個一次迴圈。則除了2^0、2^1的情況外,以2^2為基點,則2^(n-1) + 2^(2n-2) => 2^((n-3)%20) + 2^((2n-4)%20)。

#include#includeusing namespace std;

int main()

for(int i=0;icout<<"case "<<(i+1)<<": "

} return 0;

}

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