#1318 : 非法二进制数
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
如果一个二进制数包含连续的两个1,我们就称这个二进制数是非法的。
小Hi想知道在所有 n 位二进制数(一共有2n个)中,非法二进制数有多少个。
例如对于 n = 3,有 011, 110, 111 三个非法二进制数。
由于结果可能很大,你只需要输出模109+7的余数。
输入
一个整数 n (1 ≤ n ≤ 100)。
输出
n 位非法二进制数的数目模109+7的余数。
- 样例输入
-
3
- 样例输出
-
3
简单的动态规划。
我们可以先算出一共有多少个 合法 的二进制数。 用
f[n][x]
表示n位二进制数,最后1位是x(x取值0或1),合法的二进制数的数目。 于是有:f[n][0] = f[n - 1][0] + f[n - 1][1] f[n][1] = f[n - 1][0];
#include<bits/stdc++.h> using namespace std; #define ll long long #define mod 1000000007 #define pi (4*atan(1.0)) const int N=2e3+10,M=1e6+10,inf=1e9+10; ll dp[N][2]; ll quick(ll a,int x) { ll ans=1; while(x) { if(x&1) ans*=a,ans%=mod; x>>=1; a*=a; a%=mod; } return ans; } int main() { int x,y,z,i,t; scanf("%d",&x); dp[1][0]=1; dp[1][1]=1; for(i=2;i<=x;i++) { dp[i][0]=(dp[i-1][1]+dp[i-1][0])%mod; dp[i][1]=dp[i-1][0]; } cout<<((quick(2,x)-dp[x][0]-dp[x][1])%mod+mod)%mod<<endl; return 0; }
时间: 2024-11-13 09:49:05