题意:题目中定义了一种运算,把数字x变成数字x的二进制位数。问小于n的恰好k次运算可以变成1的数的个数(题目中的n是二进制数,n最大到2^1000)

思路:容易发现,无论多么大的数,只要进行了一次运算,一定会变成1000以内的数,所以我们可以预处理1000以内的数经过多少次运算到1。之后,我们可以枚举1000以内的数字,枚举有哪些数字是经过k - 1次运算到1(假设此时数字是i),那么小于n的位数为i的数字都是答案。怎么统计答案呢?我们用试填法。我们dfs中传入3个参数:deep(当前搜索到第几位), flag(判断后面的位可不可以随便填),remain(还剩多少位没有填)。我们判断第deep位可以填什么。如果n的第deep位是1,那么填1填0都可以,分别搜索。如果第deep位是0,那么只能填0。

代码:

#include <bits/stdc++.h>
#define LL long long
using namespace std;
const LL mod = 1000000007;
const int maxn = 1010;
LL C[maxn][maxn];
LL num[maxn];
LL f[maxn][maxn];//i位,需要j步到1的
char s[maxn];
LL ans;
int n;
void dfs(int deep, bool flag, int remain) {
if(n < remain) return;
if(remain == 0) {
ans = (ans + 1) % mod;
return;
}
if(deep < 1) return;
if(flag == 0) {
ans = (ans + C[deep][remain]) % mod;
return;
}
if(s[deep] == '1') {
dfs(deep - 1, 0, remain);
dfs(deep - 1, flag, remain - 1);
} else {
dfs(deep - 1, flag, remain);
}
}
int main() {
int m;
scanf("%s",s + 1);
scanf("%d", &m);
n = strlen(s + 1);
if(m == 0) {
printf("1\n");
return 0;
} else if(m == 1) {
printf("%d\n", n - 1);
return 0;
}
for (int i = 0; i <= n; i++) C[i][0] = 1;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= i; j++) {
C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod;
}
reverse(s + 1, s + 1 + n);
for (int i = 2; i <= 1000; i++) {
int cnt = 0;
for (int j = i; j; j >>= 1) {
cnt += (j & 1);
}
num[i] = num[cnt] + 1;
if(num[i] + 1 == m)
dfs(n, 1, i);
}
printf("%lld\n", ans);
}

  

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

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

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

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

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

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

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

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

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

  5. 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 ...

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

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

  7. 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 ...

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

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

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

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

随机推荐

  1. 【Prism】MEF版UIComposition

    引言 UIComposition原版Demo在PrismV5的解压包里面.原Demo用了.net4.5版本的DLL,我改成.net4.0的. RegionContext 这个Demo比之前那几个示例大 ...

  2. 【Prism】MEF版HelloWorld

    引言 Pirsm框架是由微软P & P小组设计的,用于构建组合式的WPF企业级应用,支持两个IOC容器,分别为Unity和MEF.官方地址为http://compositewpf.codepl ...

  3. nginx Win下实现简单的负载均衡(1)nginx搭建部署

    快速目录: 一.nginx Win下实现简单的负载均衡(1)nginx搭建部署 二.nginx Win下实现简单的负载均衡(2)站点共享Session 三.nginx Win下实现简单的负载均衡(3) ...

  4. Scala 面向接口编程

    1.如果要实现一个接口,前边没有extends关键字就可以使用extends,如果有要使用with关键字 2.Scala 中的接口支持多种继承,类或者抽象类不支持多种继承 3.抽象属性:未被实例化的属 ...

  5. 重温CLR(一)CLR基础

    如果一个C#developer,对CLR没有了解,那就只能是入门级别.未来.NET CORE是趋势,但是.NET CORE 也是基于CoreCLR的,而CLR和CoreCLR其实差别不大,从runti ...

  6. CH5E02 [IOI1999]花店橱窗[暴力dp]

    众所周知,这个人太菜了,所以她又来切水题了. 显然设计状态表示第$i$朵花放第$j$瓶中的最大价值.然后瞎转移一波是n三方的,加个前缀max变成n方就水过去了. 当然这题可以搜索剪枝的. 虐lyd书上 ...

  7. django的get_or_create

    转:http://www.nanerbang.com/article/51/ get_or_create会根据条件从数据库里面查找符合条件的记录,如果没有符合条件的记录,则新创建一条记录

  8. vc++2008 采用GSoap访问 WebService

    (转http://www.cppblog.com/yeqing/articles/12762.html) 前一阶段写gSOAP 的文章没保存好,后来想写的,越学越没有写的勇气了,感觉自己很菜,但是现在 ...

  9. Python 设计一个简单的计算器

    设计目标 实现加减乘除及拓号优先级解析 用户输入'1 - 2 * ( (6-3 +(-5/5)*(9-2*3/3 + 7/3*7/4*12 +10 * 5/5 )) - (-4*3)/ (12-3*2 ...

  10. pt-query-digest工具的功能介绍了:

    Ok,可以查看 pt-query-digest工具的功能介绍了: [root@472322 percona-toolkit-2.2.5]# pt-query-digest --help pt-quer ...