题目链接: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;
}

Codeforces 914 C. Travelling Salesman and Special Numbers (数位DP)的更多相关文章

  1. Codeforces 914 C Travelling Salesman and Special Numbers

    Discription The Travelling Salesman spends a lot of time travelling so he tends to get bored. To pas ...

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

    题意:题目中定义了一种运算,把数字x变成数字x的二进制位数.问小于n的恰好k次运算可以变成1的数的个数(题目中的n是二进制数,n最大到2^1000) 思路:容易发现,无论多么大的数,只要进行了一次运算 ...

  3. Codeforces 374 C. Travelling Salesman and Special Numbers (dfs、记忆化搜索)

    题目链接:Travelling Salesman and Special Numbers 题意: 给了一个n×m的图,图里面有'N','I','M','A'四种字符.问图中能构成NIMA这种序列最大个 ...

  4. Codeforces 914C Travelling Salesman and Special Numbers:数位dp

    题目链接:http://codeforces.com/problemset/problem/914/C 题意: 对数字x进行一次操作,可以将数字x变为x在二进制下1的个数. 显然,一个正整数在进行了若 ...

  5. Travelling Salesman and Special Numbers CodeForces - 914C (数位dp)

    大意: 对于一个数$x$, 每次操作可将$x$变为$x$二进制中1的个数 定义经过k次操作变为1的数为好数, 求$[1,n]$中有多少个好数 注意到n二进制位最大1000位, 经过一次操作后一定变为1 ...

  6. 【Codecraft-18 and Codeforces Round #458 (Div. 1 + Div. 2, combined) C】 Travelling Salesman and Special Numbers

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 会发现. 进行一次操作过后. 得到的数字肯定是<=1000的 然后1000以下可以暴力做的. 则我们枚举第1步后得到的数字x是 ...

  7. 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 J Beautiful Numbers (数位DP)

    2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 J Beautiful Numbers (数位DP) 链接:https://ac.nowcoder.com/acm/contest/163/ ...

  8. codeforces 55D - Beautiful numbers(数位DP+离散化)

    D. Beautiful numbers time limit per test 4 seconds memory limit per test 256 megabytes input standar ...

  9. Codeforces Beta Round #51 D. Beautiful numbers 数位dp

    D. Beautiful numbers Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/55/p ...

随机推荐

  1. Linux系统锁定关键文件

    锁定系统关键文件 1.密码.账号文件 chattr +i /etc/passwd /etc/group /etc/shadow /etc/gshadow /etc/inittab 加锁:chattr ...

  2. Linux系统设置运行级别

    设置运行级别 查看开机加载级别:7个级别 规范场景默认都是3         cat /etc/inittab --> 系统开机启动加载的文件,可以设置运行级别 # Default runlev ...

  3. Java基础知识强化之集合框架笔记79:HashMap的实现原理

    1. HashMap的实现原理之 HashMap数据结构: HashMap是对数据结构中哈希表(Hash Table)的实现, Hash表又叫散列表.Hash表是根据关键码Key来访问其对应的值Val ...

  4. BM求递推式模板

    时间复杂度\(O(N^2)\),原理不明...... #include <cstdio> #include <cstring> #include <cmath> # ...

  5. 基于PHP的cURL快速入门教程 (小偷采集程序)

    cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP.FTP.TELNET等.很多小偷程序都是使用这个函数.     最爽的是,PHP也支持 cURL 库.本文将介绍 c ...

  6. java的重载 和重写

    请看如下代码: 父类: public class FU { public void show(){ System.out.println("this is fu!"); } } 子 ...

  7. img底边空隙问题原因和解决方案(修改)

    转载自:http://www.cnblogs.com/minelucky/p/4746071.html   练习切图时发现img和父级div之间总是有2px空隙(chrome),上网搜索解决.   图 ...

  8. AWR报告中Top 10 Foreground Events存在”reliable message”等待事件的处理办法

    操作系统版本:HP-UNIX B.11.31 数据库版本:11.2.0.4 RAC (一) 问题概要 (1)在AWR报告的Top 10 Foreground Events中发现reliable mes ...

  9. 使用CoreAnimation 实现相机拍摄照片之后动画效果

    废话不多说,先看上效果,由于动画录制的时候帧率限制,只能将动画放慢了进行录制,更容易看到效果 这是点击开始之后代码 -(IBAction)btnStartClick:(id)sender { CABa ...

  10. 面向对象之static关键字

    static概念 static它是静态修饰符,一般用来修饰类中的成员. static特点 1.多个对象共享一个static成员变量.一个对象将static成员变量值修改了,其他对象中的static成员 ...