• 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;
    }
     
  • 相关阅读:
    C Looooops(扩展欧几里得)题解
    POJ1061 青蛙的约会(扩展欧几里得)题解
    UVA 11426 GCD
    Trailing Zeroes (III) (二分)题解
    BZOJ 1977 次小生成树
    BZOJ 4557 侦查守卫
    codevs 1088 神经网络
    codevs 1135 选择客栈
    BZOJ 3527 力
    BZOJ 1610 连线游戏
  • 原文地址:https://www.cnblogs.com/jhz033/p/5602909.html
Copyright © 2020-2023  润新知