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;
}
 
时间: 2024-11-13 09:49:05

hiho 1318 非法二进制数 dp的相关文章

hiho #1318 非法二进制数

#1318 : 非法二进制数 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 如果一个二进制数包含连续的两个1,我们就称这个二进制数是非法的. 小Hi想知道在所有 n 位二进制数(一共有2n个)中,非法二进制数有多少个. 例如对于 n = 3,有 011, 110, 111 三个非法二进制数. 由于结果可能很大,你只需要输出模109+7的余数. 输入 一个整数 n (1 ≤ n ≤ 100). 输出 n 位非法二进制数的数目模109+7的余数. 样例输入 3 样例输

hiho一下158(hihocoder 1318)

非法二进制数 题意:求n位的二进制数中包含11的有多少个,并对1e9+7取模 思路:简单的状态压缩dp,dp[i][0]表示i位最末位为0的个数,dp[i][1]表示i位最末位为1的个数(这里指的是不包含11的),dp[i][2]表示答案,递推式见代码 AC代码: #include "iostream" #include "string.h" #include "stack" #include "queue" #include

POJ 2923 【01背包+状态压缩/状压DP】

题目链接 Emma and Eric are moving to their new house they bought after returning from their honeymoon. Fortunately, they have a few friends helping them relocate. To move the furniture, they only have two compact cars, which complicates everything a bit.

把《c++ primer》读薄(4-2 c和c++的数组 和 指针初探)

督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1.我们知道,将一个数组赋给另一个数组,就是将一个数组的元素逐个赋值给另一数组的对应元素,相应的,将一个vector 赋给另一个vector,也是将一个vector 的元素逐个赋值给另一vector 的对应元素: //将一个vector 赋值给另一vector,使用迭代器访问vector 中的元素 vector<int> ivec(10, 20); vector<int> ivec1; for (vecto

LeetCode解题报告—— Longest Valid Parentheses

Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring. Example 1: Input: "(()" Output: 2 Explanation: The longest valid parentheses substring is "()" Example

hiho一下 第150周 -- Demo Day (DP)

hiho一下 第150周 -- Demo Day (DP) 题目1 : Demo Day 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 You work as an intern at a robotics startup. Today is your company's demo day. During the demo your company's robot will be put in a maze and without any information

hiho 1033 —— 交错和 【数位DP】

1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义交错和函数: f(x) = a0 - a1 + a2 - ... + ( - 1)n - 1an - 1 例如: f(3214567) = 3 - 2 + 1 - 4 + 5 - 6 + 7 = 4 给定 l, r, k,求在 [l, r] 区间中,所有 f(x) = k 的 x 的和,即: 输入

hihocoder 1323 - 回文字符串 - [hiho一下162周][区间dp]

用dp[i][j]表示把[i,j]的字符串str改写成回文串需要的最小操作步数. 并且假设所有dp[ii][jj] (ii>i , jj<j)都为已知,即包括dp[i+1][j].dp[i][j-1].dp[i+1][j-1]这三者都已知,则: 1. 如果str[i]==str[j],那么dp[i][j]=dp[i+1][j-1]: 2. 否则dp[i][j]可以分为: ①"一个字符"+"一个回文串"型:那么我们可以在str[i,j]后面加上一个字符,或

hiho 挑战赛7(有钱就是任性-dp与质数的因子)

题目4 : 有钱就是任性 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 俗话说,有钱就是任性.我们的高富帅鱼丸同学打算去看电影.鱼丸到了电影院以后,发现座位的编号正好是1到200. 但是有一些座位号对应的座位坏掉了,没法坐,不妨假设还剩下N个能坐的椅子.电影的老板告诉鱼丸,如果你要包下一个集合S里的所有椅子,就要付出这些椅子的编号的最小公倍数的钱.鱼丸很任性地同意了. 来这里玩了很多天以后,鱼丸发现自己正好来了2N-1天,并且由于他非常任性,对于这N个椅子的每一种