時間限制:
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提示dna序列僅由腺嘌呤(a),鳥嘌呤(g),胞嘧啶(c),胸腺嘧啶(t)四種核苷酸組成。6
當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,...