HDU 2065 紅色病毒 問題 附遞推

2021-07-08 18:48:40 字數 2835 閱讀 5284

problem description

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

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

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

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

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

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

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

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

input

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

output

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

sample input

414

2011314

2460

sample output

case 1: 2

case 2: 72

case 3: 32

case 4: 0

case 1: 56

case 2: 72

case 3: 56

由於b、d可出現0-n之間任意次,a、c只能出現0-n之間偶數次,

結合指數型母函式可得:

f(x)=(1+x/1!+x^2/2!+x^3/3!…+x^n/n!)^2*(1+x^2/2!+x^4/4!+x^6/6!…+…)^2

由泰勒公式:

e^x=1+x/1!+x^2/2!+x^3/3!…+x^n/n!;

e^(-x)=1-x/1!+x^2/2!-x^3/3!+…-…

兩式相加可得:

e^x+e^(-x)=(1+x^2/2!+x^4/4!+x^6/6!…+…)*2;

所以:f(x) =e^(2x) * ((e^x+e^(-x))/2)^2

= (1/4) * e^(2x) * (e^(2x) + 2 + e^(-2x))

= (1/4) * (e^(4x) + 2*e^(2x) +1)

= (1/4) * ( (1+4x/1!+(4x)^2/2!+(4x)^3/3!+…+(4x)^n/n!) + 2*(1+2x/1!+(2x)^2/2!+(2x)^3/3!+…+(2x)^n/n!) +1)

得:  x^n/n! 項係數

a(n)    = (1/4) * ((4x)^n/n! + 2*(2x)^n/n!)

= (1/4) * ( 4^n*x^n/n! + 2^(n+1)*x^n/n!)

= (4^(n-1) + 2^(n-1)) * x^n/n!

即所求

f(n) = (4^(n-1) + 2^(n-1)) % 100.

#include int pow_mod(int a, long long b, int m)//a^b mod m

int main()

printf("\n");

} return 0;

}

遞推法:

考慮n個字母時所有可能情況:【注意只考慮各字母出現次數不考慮排列】

f(n) =f(n,aoco)+f(n,a0cj)+f(n,ajco)+f(n,ajcj)[o、j分別對應相應字母出現次數的奇偶性]

=f(n,0)        +f(n,1)      +f(n,2)        +f(n,3)

則當n+1個字母時

f(n+1,aoco)=[f(n,aoco)+b/c]+[f(n,a0cj)+c]+[f(n,ajco)+a],即f(n+1,0)=f(n,0)*2+f(n,1)+f(n,2)

f(n+1,aocj)=[f(n,aoco)+c]+[f(n,a0cj)+b/c]+[f(n,ajcj)+a],即f(n+1,1)=f(n,0)+f(n,1)*2+f(n,3)

f(n+1,ajco)=[f(n,aoco)+a]+[f(n,ajco)+b/c]+[f(n,ajcj)+c],即f(n+1,2)=f(n,0)+f(n,2)*2+f(n,3)

f(n+1,ajcj)=[f(n,aocj)+a]+[f(n,ajco)+c]+[f(n,ajcj)+b/c],即f(n+1,3)=f(n,1)+f(n,2)+f(n,3)*2

且f(1,0)=2,f(1,1)=f(1,2)=1,f(1,3)=0;

驗證: f(2,0)=2*2+1+1=6;

f(2,1)=2+1*2+0=4;

f(2,2)=2+1*2+0=4;

f(2,3)=1+1+0*2=2;

結果正確。

#include #define maxn 10000

int a[maxn][4] = , };

int main()

/* 由於n可取值太大,不可能直接a[n][0]a輸出,所以需要找規律,可以顯示著輸出前50項結果

for (int i = 1;i <= 50;i+=5)

printf("%2d %2d %2d %2d %2d\n", a[i][0], a[i+1][0], a[i+2][0], a[i+3][0], a[i+4][0]);

可知從第a[20][0]起是週期為20的輸出。

*/ int t;

long long n;

while (~scanf("%d", &t) && t)

printf("\n");

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