NYOJ 1075 (遞推 矩陣快速冪)

2021-06-25 22:27:57 字數 1609 閱讀 6148

時間限制:

1000 ms  |  記憶體限制:

65535 kb

難度:4

描述醫學研究者最近發現了一種新病毒,因為其蔓延速度與曾經在internet上傳播的「紅色**」不相上下,故被稱為「紅色病毒」。

經研究發現,該病毒及其變種的dna序列中,腺嘌呤(a)、胞嘧啶(c)均是成對出現的。lyh想知道在這種特徵下,所有

可能成為該病毒的dna序列的個數。

輸入多組測試資料。

每組資料輸入乙個整數n,表示該病毒dna序列的長度。(1≤n≤10^9)

n=0時表示輸入結束,不用做任何處理。

輸出每組輸出佔一行,代表該病毒長度為n的所有可能的dna序列個數。由於結果可能非常大,你只需輸出對10007取餘後的結果即可。

樣例輸入

1

2

樣例輸出
2

6

提示dna序列僅由腺嘌呤(a),鳥嘌呤(g),胞嘧啶(c),胸腺嘧啶(t)四種核苷酸組成。

當n=2時,所有可能的dna序列為tt、tg、gt、gg、aa、cc。

分析:因為題目要求a和c要成對出現,即a和c的數量都是偶數,所以可以定義4個狀態:

dp[n][0]表示長度為n時a的數量為偶數,c的數量也為偶數,

dp[n][1]表示長度為n時a的數量為偶數,c的數量為奇數,

dp[n][2]表示長度為n時a的數量為奇數,c的數量為偶數,

dp[n][3]表示長度為n時a的數量為奇數,c的數量也為奇數的dna序列的數量,

則dp[n][0] = dp[n-1][0] * 2 + dp[n-1][1] * 1 + dp[n-1][2] * 1 + dp[n-1][3] * 0

dp[n][1] = dp[n-1][0] * 1 + dp[n-1][1] * 2 + dp[n-1][2] * 0 + dp[n-1][3] * 1

dp[n][2] = dp[n-1][0] * 1 + dp[n-1][1] * 0 + dp[n-1][2] * 2 + dp[n-1][3] * 1

dp[n][3] = dp[n-1][0] * 0 + dp[n-1][1] * 1 + dp[n-1][2] * 1 + dp[n-1][3] * 2

根據這個遞推關係,可以構造出如下乙個4*4的矩陣,

| 2    1    1   0 |

| 1    2    0   1 |

| 1    0    2   1 |

| 0    1    1   2 |

然後利用矩陣快速冪就可以快速求出答案。

#include#include#define mod 10007

struct matrix

};matrix multi(matrix a, matrix b) }}

return res;

}matrix pow(matrix a, int x)

return res;

}int main()

return 0;

}

NYOJ 301 遞推求值(矩陣快速冪)

時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 給你乙個遞推公式 f x a f x 2 b f x 1 c 並給你f 1 f 2 的值,請求出f n 的值,由於f n 的值可能過大,求出f n 對1000007取模後的值。注意 1對3取模後等於2 輸入 第一行是乙個整數t,...

NYOJ 301 遞推求值 矩陣快速冪

時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 給你乙個遞推公式 f x a f x 2 b f x 1 c 並給你f 1 f 2 的值,請求出f n 的值,由於f n 的值可能過大,求出f n 對1000007取模後的值。注意 1對3取模後等於2 輸入 第一行是乙個整數t,...

矩陣快速冪 nyoj301 遞推求值

時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 給你乙個遞推公式 f x a f x 2 b f x 1 c 並給你f 1 f 2 的值,請求出f n 的值,由於f n 的值可能過大,求出f n 對1000007取模後的值。注意 1對3取模後等於2 輸入 第一行是乙個整數t,...