分析 本题 给我 第一感觉就是 动态规划,
第二 就是 有 非法二进制数 是否 可以通过 全部的二进制数 减去 合法的二进制数 来取得;
全部的二进制数 数量 为 2的N次方个,这是 明确的;本题 关键就在于求出 合法二进制数;
n位合法二进制数 n-1位肯定为合法的二进制数,因此可分为两种case 去分析;
用dp[n][m]表示 合法二进制数的数量;n表示位数,m表示末尾位的值,m取值0,1;
1.n位合法二进制数中末尾为1;
末尾为1时,n-1位的二进制合法数的末尾位必须为0,此时dp[n][1]=dp[n-1][0]
2.n位合法二进制数中末尾为0;
末尾位是0时,n-1位二进制合法数的末尾位将不会受到任何限制,此时dp[n][0] = dp[n-1][0] + dp[n-1][1];
最后 全部二进制数减去合法二进制数 即可得到非法的二进制数;
#include <iostream> #include <cmath> using namespace std; long long dp[101][2]; const int mod = 1e9 + 7; int main() { dp[0][0] = dp[0][1] = 1; int n; cin >> n; for (int i = 1; i < n; ++i) { dp[i][0] = (dp[i - 1][0] + dp[i - 1][1]) % mod; dp[i][1] = dp[i - 1][0]; } int temp = 1; for (int i = 1; i <= n; i++) { temp = (temp * 2) % mod; } long long sum = (dp[n - 1][0] + dp[n - 1][1]) % mod; cout<<(temp-sum+mod)%mod<<endl; }