hiho 1318 非法二进制数 dp

Posted xjhz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hiho 1318 非法二进制数 dp相关的知识,希望对你有一定的参考价值。

#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;
}

 

 

以上是关于hiho 1318 非法二进制数 dp的主要内容,如果未能解决你的问题,请参考以下文章

hiho一下158(hihocoder 1318)

hiho #1318 非法二进制数

poj 3252 Round Numbers 数位DP

hiho_1057_performance_log

hihocoder 1331 - 扩展二进制数 - [hiho一下168周]

题解bzoj2560串珠子