题目链接:Travelling Salesman and Special Numbers

题意:

  给出一个二进制数n,每次操作可以将这个数变为其二进制数位上所有1的和(3->2 ; 7->3),现在给出了一个数k,问不大于n的数中有几个数经过k次操作可以变成1。

题解:

  因为所给的n很大,但是可以发现只要经过一次操作,n都会变成1000以内的数,所以可以把1000以内的数的答案都存下来。每次在这里面找等于k-1的数,然后数位DP求个数。

 #include<bits/stdc++.h>
using namespace std;
const int MAX_N = 1e3+;
const int MOD = 1e9+;
char s[MAX_N];
int len;
int f[MAX_N][MAX_N];
long long res[MAX_N];
void init()
{
memset(f,-,sizeof(f));
for(int i=;i<=;i++)
{
int t = i;
int num = ;
while(t>)
{
int temp = ;
while(t)
{
t -= t&-t;
temp++;
}
t = temp;
num++;
}
res[i] = num;
}
}
int dp(char *s,int pos,int num,int tar,int limit)
{
if(num > tar || tar>) return ;
if(pos == len)
{
if(num == tar) return ;
else return ;
}
if(!limit && f[pos][tar-num]!=-) return f[pos][tar-num];
int up = limit?s[pos]-'':;
int ans = ;
for(int i=;i<=up;i++) ans = (ans + dp(s,pos+,i==?num+:num,tar,limit&&i==up))%MOD;
if(!limit) f[pos][tar-num] = ans;
return ans;
}
int main()
{
init();
scanf("%s",s);
len = strlen(s);
int num = ;
int k;
cin>>k;
if(k==)
{
cout<<<<endl;
return ;
}
if(k==)
{
cout<<len-<<endl;
return ;
}
long long ans =;
for(int i=;i<len;i++) if(s[i] == '') num++;
for(int i=;i<=;i++)
{
if(res[i] == k-)
{
ans = (ans + dp(s,,,i,))%MOD;
//cout<<"...."<<i<<"....."<<dp(s,0,0,i,1)<<endl;
}
}
cout<<ans<<endl;
}

最新文章

  1. SQL语句实现Split并合并查询结果
  2. js乱码解决方法
  3. Flex:自定义滚动条样式/隐藏上下箭头
  4. markdown思维导图笔记
  5. Rotate String
  6. hdu 1021
  7. Codevs No.1287 矩阵乘法
  8. Android ListView分页加载时图片显示问题
  9. Centos6.4安装JDK
  10. newlisp 接受jenkins带空格的参数
  11. shuffle过程简介--笔记
  12. Java 生产者消费者模式详细分析
  13. USB2.0学习笔记连载(一):CY7C68013特性简介
  14. ajax的type为get的时候报405错误,改成post就OK,这是为什么?老师写的get可以请求成功,我的就不行,附图
  15. 带你从零学ReactNative开发跨平台App开发(二)
  16. Debian下的crontab保存
  17. Android SharedPreference
  18. JS 写入到文件
  19. Onvif鉴权实现方式
  20. 队列之blah集合

热门文章

  1. Redis(三)Redis基本命令操作与API
  2. jenkins+gitlib+git+mysql5.6+sonarqube+sonarrunner
  3. Linux FFmpeg(含x264、lame插件)安装记录
  4. windows server 2016部署服务
  5. CI 2.2 + smarty 3.1.18 完美整合配置成功
  6. php解决约瑟夫环的问题
  7. Java 替换空格
  8. gitlab+jenkins环境搭建.md
  9. using指令都用了这么多年了,其实还真没懂!
  10. OOP——构造函数、析构函数