题意

给出一个二进制数\(n\),每次操作可以将一个整数\(x\)简化为\(x\)的二进制表示中\(1\)的个数,如果一个数简化为\(1\)所需的最小次数为\(k\),将这个数叫做特殊的数,

问从\(1\)到\(n\)一共有多少个特殊的数,答案对\(1e9+7\)取模。

分析

\(n\)最大为\(2^{1000}\),二进制表示中最多有\(1000\)个\(1\),所以\(n\)以内的数经过一次简化后将变为\(1000\)以内的数,我们可以暴力打表\(1000\)以内的数简化为\(1\)所需的最少次数,将求得的次数加\(1\)即为二进制中\(1\)的个数为\(x\)的数简化为\(1\)所需的最少次数为\(cnt[x]\),\(1\)这个数要特判,没特判wa了3发。。。

然后分情况讨论:

  • \(k=0\),答案为\(1\),只有\(1\)是经过\(0\)次简化到\(1\)的数

  • \(k=1\),答案为\(n\)的位数\(-1\),\(n\)除了第\(1\)位,其余每一位为\(1\)都是特殊的数

  • \(k>1\),直接数位dp,设\(dp[i][j]\)为枚举到第\(i\)位二进制中\(1\)的个数为\(j\),\(cnt[x]==k\)的数为特殊的数

Code

    #include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef long long ll;
const double PI=acos(-1.0);
const double eps=1e-6;
const int inf=1e9;
const int mod=1e9+7;
const int maxn=1e5+10;
char s[1010];
int a[1010],cnt[1010],k;
ll dp[1010][1010];
ll dfs(int pos,int x,int limit){
if(pos==0) return cnt[x]==k;
if(!limit&&~dp[pos][x]) return dp[pos][x];
int up=limit?a[pos]:1;
ll ret=0;
for(int i=0;i<=up;i++){
ret+=dfs(pos-1,x+(i==1),limit&&i==a[pos]);
ret%=mod;
}
if(!limit) dp[pos][x]=ret;
return ret;
}
int solve(int x){
if(x==1) return 0;
int ret=0;
int cnt=0;
while(x){
if(x&1) cnt++;
x>>=1;
}
ret+=solve(cnt)+1;
return ret;
}
void init(int n){
for(int i=1;i<=n;i++){
cnt[i]=solve(i)+1;
}
}
int main(){
ios::sync_with_stdio(false);
init(1005);
memset(dp,-1,sizeof(dp));
cin>>s+1>>k;
int n=strlen(s+1);
for(int i=1;i<=n;i++){
a[n-i+1]=s[i]-'0';
}
if(k==1){
cout<<n-1;
}else if(k==0) cout<<1;
else cout<<dfs(n,0,1);
return 0;
}

Codeforces 914 C 数位DP+暴力打表+思维的更多相关文章

  1. HDU 5179 beautiful number (数位dp / 暴力打表 / dfs)

    beautiful number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  2. codeforces Hill Number 数位dp

    http://www.codeforces.com/gym/100827/attachments Hill Number Time Limits:  5000 MS   Memory Limits: ...

  3. CodeForces - 55D(数位dp,离散化)

    题目来源:http://codeforces.com/problemset/problem/55/D Volodya is an odd boy and his taste is strange as ...

  4. Codeforces #55D (数位dp+离散化)

    Description Volodya is an odd boy and his taste is strange as well. It seems to him that a positive ...

  5. [DP]数位DP总结

     数位DP总结 By Wine93 2013.7 1.学习链接 [数位DP] Step by Step   http://blog.csdn.net/dslovemz/article/details/ ...

  6. 2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6156 数位DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6156 题意:如题. 解法:数位DP,暴力枚举进制之后,就转化成了求L,R区间的回文数的个数,这个直接做 ...

  7. Codeforces 914 C. Travelling Salesman and Special Numbers (数位DP)

    题目链接:Travelling Salesman and Special Numbers 题意: 给出一个二进制数n,每次操作可以将这个数变为其二进制数位上所有1的和(3->2 ; 7-> ...

  8. Codeforces 55D (数位DP+离散化+数论)

    题目链接: http://poj.org/problem?id=2117 题目大意:统计一个范围内数的个数,要求该数能被各位上的数整除.范围2^64. 解题思路: 一开始SB地开了10维数组记录情况. ...

  9. BZOJ 4513: [Sdoi2016]储能表 [数位DP !]

    4513: [Sdoi2016]储能表 题意:求\[ \sum_{i=0}^{n-1}\sum_{j=0}^{m-1} max((i\oplus j)-k,0) \] 写出来好开心啊...虽然思路不完 ...

随机推荐

  1. SpringBoot部署流程

    一.  项目介绍 a)     本项目为SpringBoot项目 b)     使用内置Tomcat容器 一.  操作步骤 a)     配置pom.xml文件,确定打包方式 b)     更改项目返 ...

  2. app数据加密方法

    由于项目涉及到注册和登录,所以我了解一下现在app使用比较广泛的几种密码加密方法,可以当作参考,以下都是在python3.5的环境下使用这些算法的例子. 1.base64 Base64是一种基于64个 ...

  3. log4j.properties的配置详解

    log4j.rootLogger=ERROR,A1log4j.appender.A1=org.apache.log4j.ConsoleAppenderlog4j.appender.A1.layout= ...

  4. c++——对象的动态建立和释放(new 和delete)

    3.8 对象的动态建立和释放 1 new和delete基本语法 1)在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除.在C语言中是利用库函数malloc和free来 ...

  5. git +maven+java+jenkins自动化代码持续集成

    1.安装JDK JDK下载: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 新 ...

  6. JFinal文件下载及设置路径

    一:利用超链接 <a href="/download/a.docx">download</a> 二:java代码 1.页面 <a href=" ...

  7. “unauthorized: authentication required” -- openshift3.9 docker push 报错

    1.docker tag mybank-tomcat:latest 172.30.25.185:5000/mybank-tomcat:latest 2.当往registrypush镜像的时候, doc ...

  8. ASP.NET Core多语言 (转载)

    ASP.NET Core中提供了一些本地化服务和中间件,可将网站本地化为不同的语言文化.ASP.NET Core中我们可以使用Microsoft.AspNetCore.Localization库来实现 ...

  9. package.json常用的字段

    package.json中5个字段: name: 包名 今后下载时输入名称 (注意:要与下载的包名不一样) version:版本号 x.x.x 例如 1.2.3 1 大版本:当这个包有巨大内容变化时( ...

  10. MySQL原生语句个人补漏

    # insert插入insert into table_name (field1,field2...fieldn) **values** (value1,value2...valuen);所有列需添加 ...