Codecraft-18 and Codeforces Round #458 (Div. 1 + Div. 2, combined) C. Travelling Salesman and Specia
题目链接:点击打开链接
题目大意:给出一个二进制数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相关推荐
- 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这个时候两 ...
- 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 ...
- 【Codeforces Round #458 D.Bash and a Tough Math Puzzl】线段树
链接 Codecraft-18 and Codeforces Round #458 (Div. 1 + Div. 2, combined) 题意 给你一个区间,要支持两种区间操作. 第一种操作是单点更 ...
- Educational Codeforces Round 114 (Rated for Div. 2) (A ~ F)全题解
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Educational Codeforces Round 114 (Rated for Div. 2) ...
- Educational Codeforces Round 106 (Rated for Div. 2)(A ~ E)题解(每日训练 Day.16 )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 Educational Codeforces Round 106 (Rated for Div. ...
- Educational Codeforces Round 37 (Rated for Div. 2) 1
Educational Codeforces Round 37 (Rated for Div. 2) A.Water The Garden 题意:Max想给花园浇水.花园可被视为长度为n的花园床,花园 ...
- 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, ...
- Educational Codeforces Round 114 (Rated for Div. 2) D. The Strongest Build 暴力 + bfs
传送门 文章目录 题意: 思路: 题意: 你有nnn个装备槽,每个槽里面有cic_ici个力量加成,对于每个槽只能选一个力量加成,现在给你mmm个力量组合[b1,b2,...,bn][b_1,b_2 ...
- Educational Codeforces Round 72 (Rated for Div. 2) D. Coloring Edges dfs树/拓扑找环
传送门 文章目录 题意: 思路: 题意: 给你一张图,你需要给这个图的边染色,保证如果有环那么这个环内边的颜色不全相同,输出染色方案和用的颜色个数. n,m≤5e3n,m\le5e3n,m≤5e3 思 ...
最新文章
- python模拟手写笔迹_pytorch实现MNIST手写体识别
- Java Formatter format()方法及示例
- 我被认定为高层次人才了!
- 高效实用Kafka-Kafka消息处理(底层原理)
- 人脸识别资源推荐:20款人脸检测/识别的API、库和软件
- 基本数据结构之Sort
- rrt matlab算法,rrt算法matlab代码
- 回顾:程序设计方法——结构化设计
- 2017年sfdc工作总结_Name 顺序
- 触摸屏计算机技术参数,触摸屏硬件安装—— 触摸屏参数设置
- 回撤率 python_【Python量化】O(n)复杂度实现最大回撤的计算
- Excel同时检测两列的重复值的方法
- 回归和分类的线性模型
- 学会了使用计算机之后作文,我学会了计算机
- elasticsearch7.x clusterAPI之settings
- 某A的工口游戏创作者体验记(上)
- 2019-12-17
- Makefile文件自动生成,ubuntu系统autotools使用
- 关于postgre的几条命令
- C#实现自动下载yunfile文件