#1318 : 非法二进制数
题目链接:
点击打开链接
思路:简单的dp,算出n位的总数,根据0面可以接1或0,1后面只能接0,公式为dp[i][0] = (dp[i-1][0] + dp[i-1][1])和dp[i][1] = dp[i-1][0]算出符合的个数,ans=总数-合法
代码:
#include<iostream>
using namespace std;
const int mod = 1e9+7;
long long dp[101][2];
int main()
{
int n;
while(cin>>n)
{
dp[0][0] = dp[0][1] = 1;
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];
}
long long ans = 1,num = 0;
num = (dp[n-1][0] + dp[n-1][1]) % mod;
for(int i = 1; i <= n; i ++)
{
ans = (ans*2)%mod;
}
cout<<(ans-num+mod)%mod<<endl;
}
}