hiho 題目1 : 非法二進位制數(數位dp)
阿新 • • 發佈:2018-12-04
描述
如果一個二進位制數包含連續的兩個1,我們就稱這個二進位制數是非法的。
小Hi想知道在所有 n 位二進位制數(一共有2n個)中,非法二進位制數有多少個。
例如對於 n = 3,有 011, 110, 111 三個非法二進位制數。
由於結果可能很大,你只需要輸出模109+7的餘數。
輸入
一個整數 n (1 ≤ n ≤ 100)。
輸出
n 位非法二進位制數的數目模109+7的餘數。
樣例輸入3樣例輸出
3
用dp[i][j][k], i 為第幾位, j用來表示當前是否已經非法, k表示當前為是0還是1
#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <string> #include <functional> #include <cmath> #include <set> #include <queue> #include <algorithm> #include <vector> #include <map> #include <stack> using namespace std; #define esp 1e-8 const double PI = acos(-1.0); const double e = 2.718281828459; const int inf = 2147483647; const long long mod = 1000000007; typedef long long ll; //freopen("in.txt","r",stdin); //輸入重定向,輸入資料將從in.txt檔案中讀取 //freopen("out.txt","w",stdout); //輸出重定向,輸出資料將儲存在out.txt檔案中 ll dp[105][5][5]; int main() { int n, i, j; while (cin >> n) { dp[0][0][0] = 1; for (i = 1; i <= n; ++i) { dp[i][1][1] = (dp[i - 1][0][1] + dp[i - 1][1][0] + dp[i - 1][1][1]) % mod; dp[i][1][0] = (dp[i - 1][1][0] + dp[i - 1][1][1]) % mod; dp[i][0][1] = dp[i - 1][0][0]; dp[i][0][0] = (dp[i - 1][0][0] + dp[i - 1][0][1]) % mod; } ll s = (dp[n][1][1] + dp[n][1][0]) % mod; cout << s << endl; } }