题目链接:点击打开链接

题目大意:给出一个二进制数m,这个二进制数中1的个数为n,将m转变为n记做操作一次,知道将m转变为1结束,操作的总次数记为m的步长。

现在给出一个数n,和步长k,求小于等于n的数中有多少个数的步长为k。因为个数过多,需要模109 + 7.

思路:

2的1000次方是一个很大的数,但是只要经过一次操作之后,就会变成一个小于等于1000的数,所以我们可以先预处理出来所有小于等于1000的数需要多少次操作转化为1。

现在的n需要经过x次操作变成1,那么n经过一次操作得到的数就需要经过x-1次操作变成1

根据预处理的结果,我们可以找到哪些数经过x-1次操作变成1

如果找到了数r,那么就需要在小于等于n的范围内,排列r个1

要保证小于等于n的话,可以从最高位开始进行这样的操作,i代表现在的位数,nones表示已经出现了多少个1

当该位为1的时候,我们考虑:

如果将该为的1变为0,则在后面的n.size()-i-1个位置中找j-nones个位置  即C(n.size()-i-1,j-nones)

如果该为1不变,则nones++,继续进行下一位操作

如果该位为0,

则只有直接nones++,继续进行下一位操作。

注意点:有三个特例需要注意,如果k==0,则直接输出1

如果k==1,计算的时候不要把1也记为步长为1

因为考虑的时候没有考虑的本身,所以最后要特别检验下自身是否满足

#include <bits/stdc++.h>
using namespace std;#define MOD 1000000007int dp[1004];
long long ncr[1004][1004];int ones(int n)
{int cnt = 0;while(n){if(n%2 == 1){cnt++;}n /= 2;}return cnt;
}void calcncr()//预处理组合数
{for(int i = 0; i <= 1000; i++){ncr[i][0] = 1;}for(int i = 1; i <= 1000; i++){for(int j = 1; j <= 1000; j++){ncr[i][j] = (ncr[i-1][j-1] + ncr[i-1][j])%MOD;}}
}int main()
{string n;int k;calcncr();dp[1] = 0;for(int i = 2; i <= 1000; i++)//预处理小于等于1000的数到1的步数{dp[i] = dp[ones(i)] + 1;}cin >> n >> k;if(k == 0){cout << "1\n";return 0;}long long nones = 0, ans = 0;for(int i = 0; i < n.size(); i++){if(n[i] == '0'){continue;}for(int j = max(nones, 1LL); j < 1000; j++){if(dp[j] == k-1){ans = (ans + ncr[n.size()-i-1][j-nones])%MOD;if(i == 0 && k == 1)//这里主要去掉1本身这种特殊的情况 1到1的步数是0不是1{ans = (ans+MOD-1)%MOD;}}}nones++;}int cnt = 0;for(int i = 0; i < n.size(); i++){if(n[i] == '1'){cnt++;}}if(dp[cnt] == k-1)//加上自己本身{ans = (ans + 1)%MOD;}cout << ans << endl;return 0;
}

Codecraft-18 and Codeforces Round #458 (Div. 1 + Div. 2, combined) C. Travelling Salesman and Specia相关推荐

  1. Educational Codeforces Round 90 (Rated for Div. 2)(A, B, C, D, E)

    Educational Codeforces Round 90 (Rated for Div. 2) Donut Shops 思路 分三种情况: a==c/ba == c / ba==c/b这个时候两 ...

  2. Educational Codeforces Round 61 (Rated for Div. 2)(A、B、C、D、E、F)

    欢迎访问本菜鸡的独立博客:Codecho 比赛名称 Educational Codeforces Round 61 (Rated for Div. 2) 比赛链接 https://codeforces ...

  3. 【Codeforces Round #458 D.Bash and a Tough Math Puzzl】线段树

    链接 Codecraft-18 and Codeforces Round #458 (Div. 1 + Div. 2, combined) 题意 给你一个区间,要支持两种区间操作. 第一种操作是单点更 ...

  4. Educational Codeforces Round 114 (Rated for Div. 2) (A ~ F)全题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Educational Codeforces Round 114 (Rated for Div. 2) ...

  5. Educational Codeforces Round 106 (Rated for Div. 2)(A ~ E)题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 Educational Codeforces Round 106 (Rated for Div. ...

  6. Educational Codeforces Round 37 (Rated for Div. 2) 1

    Educational Codeforces Round 37 (Rated for Div. 2) A.Water The Garden 题意:Max想给花园浇水.花园可被视为长度为n的花园床,花园 ...

  7. Educational Codeforces Round 89 (Rated for Div. 2)(A, B, C, D)

    Educational Codeforces Round 89 (Rated for Div. 2) A. Shovels and Swords 思路 题意非常简单,就是得到最多的物品嘛,我们假定a, ...

  8. Educational Codeforces Round 114 (Rated for Div. 2) D. The Strongest Build 暴力 + bfs

    传送门 文章目录 题意: 思路: 题意: 你有nnn个装备槽,每个槽里面有cic_ici​个力量加成,对于每个槽只能选一个力量加成,现在给你mmm个力量组合[b1,b2,...,bn][b_1,b_2 ...

  9. Educational Codeforces Round 72 (Rated for Div. 2) D. Coloring Edges dfs树/拓扑找环

    传送门 文章目录 题意: 思路: 题意: 给你一张图,你需要给这个图的边染色,保证如果有环那么这个环内边的颜色不全相同,输出染色方案和用的颜色个数. n,m≤5e3n,m\le5e3n,m≤5e3 思 ...

最新文章

  1. python模拟手写笔迹_pytorch实现MNIST手写体识别
  2. Java Formatter format()方法及示例
  3. 我被认定为高层次人才了!
  4. 高效实用Kafka-Kafka消息处理(底层原理)
  5. 人脸识别资源推荐:20款人脸检测/识别的API、库和软件
  6. 基本数据结构之Sort
  7. rrt matlab算法,rrt算法matlab代码
  8. 回顾:程序设计方法——结构化设计
  9. 2017年sfdc工作总结_Name 顺序
  10. 触摸屏计算机技术参数,触摸屏硬件安装—— 触摸屏参数设置
  11. 回撤率 python_【Python量化】O(n)复杂度实现最大回撤的计算
  12. Excel同时检测两列的重复值的方法
  13. 回归和分类的线性模型
  14. 学会了使用计算机之后作文,我学会了计算机
  15. elasticsearch7.x clusterAPI之settings
  16. 某A的工口游戏创作者体验记(上)
  17. 2019-12-17
  18. Makefile文件自动生成,ubuntu系统autotools使用
  19. 关于postgre的几条命令
  20. C#实现自动下载yunfile文件

热门文章

  1. 大数据分析与应用(中级) 大数据分析概述
  2. SDUTOJ(2109)找女朋友
  3. ORY Hydra项目详解
  4. 面试:Handler内存泄露的原因是什么?
  5. UE4最简单的方法实现视频抠像
  6. 市值跌破300亿美元!这是京东逆袭的四个方向
  7. HBase的compact分析
  8. pyspider爬取免费正版图片网站Pixabay
  9. Windows 更新:服务堆栈更新
  10. rsync、gitlab、svn安装和使用