hihoCoder1318—非法二进制数(数位dp)
来源:互联网 发布:广州java 外包公司 编辑:程序博客网 时间:2024/05/20 03:43
题目链接:传送门
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
- 样例输入
3
- 样例输出
3
描述
如果一个二进制数包含连续的两个1,我们就称这个二进制数是非法的。
小Hi想知道在所有 n 位二进制数(一共有2n个)中,非法二进制数有多少个。
例如对于 n = 3,有 011, 110, 111 三个非法二进制数。
由于结果可能很大,你只需要输出模109+7的余数。
输入
一个整数 n (1 ≤ n ≤ 100)。
输出
n 位非法二进制数的数目模109+7的余数。
解题思路:用数位dp求出合法的二进制数个数num,然后2^n-num
dp[pos][state]:state记录二进制数的前一位是否为1。
#include <cstdio> #include <cstring> #include <cmath> #include <iostream> #include <queue>#include <set>#include <string>#include <stack>#include <algorithm>#include <map>#include <bitset>using namespace std; typedef long long ll;const int N = 105;const int M = 1000009;const int INF = 0x3fffffff;const int mod = 1e9+7;const double Pi = acos(-1.0);const double sm = 1e-9;typedef pair<int,int>PA;int a[N],dp[N][2],re[N];void getRe(){re[0] = 1;for( int i = 1 ; i < N ; ++i ){re[i] = re[i-1]*2%mod;}}int dfs( int pos , int state , int flag , int limit ){if( pos == -1 ) return flag == 0;if( dp[pos][state] != -1 && !limit ) return dp[pos][state];int up = (limit==0)?1:a[pos];int ans = 0;for( int i = 0 ; i <= up ; ++i ){if( flag || (i==1&&state) ) continue;ans = (ans+dfs( pos-1 , i == 1 , flag||(i==1&&state) , limit&&(i==a[pos]))%mod)%mod;}if( !limit ) dp[pos][state] = ans;return ans;}int solve( int n ){for( int i = 0 ; i < n ; ++i ) a[i] = 1;return dfs( n-1 , 0 , 0 , 1 );}int main(){int n;getRe();memset( dp , -1 , sizeof(dp) );while( cin >> n ){int ans = solve(n);ans = re[n]-ans;if( ans < 0 ) ans += mod;cout << ans << endl;}return 0;}
阅读全文
0 0
- hihoCoder1318—非法二进制数(数位dp)
- [hihocoder1318]非法二进制数
- hiho 题目1 : 非法二进制数(数位dp)
- hihocoder #1318 : 非法二进制数(dp)
- hiho一下 第158周 非法二进制数 (dp)
- bzoj3209(二进制数位dp)
- windy数(数位DP)
- windy数(数位dp)
- 数位dp(平衡数)
- Windy数(数位dp)
- Windy数(数位dp)
- Arithmetic problem | 非法二进制数
- hihocoder #1318 : 非法二进制数
- SCOI2009——windy数(数位DP)
- ACDream 1064——完美数(数位DP)
- CCF认证——有趣的数(数位DP)
- Lightoj1205——Palindromic Numbers(数位dp+回文数)
- BZOJ1026——windy数(数位DP)
- Spark的Dataset操作(一)-列的选择select
- python requests 库使用小结(二)
- c++阉割版binder实现
- Android多点触摸
- Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor
- hihoCoder1318—非法二进制数(数位dp)
- JAVA第一课第七节知识点
- 2017年/7月/9日随手记_表单跳转后地址栏多了问号
- GreenPlum之进程会话管理篇
- 欢迎使用CSDN-markdown编辑器
- 【Linux】crond机制以及cronttab命令
- 预习循环和循环以及作业
- MVC与单元测试实践之健身网站(七)-日程与打卡
- C++11中继承构造函数和委派构造函数