codeforces914C Travelling Salesman and Special Numbers 二进制特性+组合数学+递推

Codeforces Round#458Div.1+2 C.Travelling Salesman and Special Numbers 数位dp C. Travelling Salesman and Special Numberstime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputThe Travelling Salesman spends a lot of time travelling s... 阅读详情

比较骚的一道题。。
题意大概是,我们定义一次操作αα:将一个数ii二进制是1的位数取出来。
比如说,1010=10102,所以α(10)=2α(10)=2。
显然,任何数数在经过多次αα操作之后,一定能够成为1。现在有一个数i(i≤21000)i(i≤21000),求一共有多少数mm在k次变化之后可以变成1,并且m≤im≤i。
答案对109+7109+7取模。


首先,我们发现一个性质:由于这个数是小于2100021000的,所以在第一次的变化之后结果一定是小于1000的。
因此,我们可以想到预处理出来1000以内的数需要多少次变化,而这一过程可以递推求解:f[i]=f[getbit(i)]+1f[i]=f[getbit(i)]+1,其中getbit()是用来求出一个数二进制下有多少位是1的:

inline int getbit(int x) {
    int ans = 0;
    while(x) {
        if(x & 1) ++ans;
        x >>= 1;
    }
    return ans;
}

然后呢?现在的问题集中在,如果给定ii,如何求出比i小并且位数的dp值是k−1k−1的,也就是变化之后只需要k−1k−1次。
不妨讨论一下如果某个位是0,那么我们就可以忽略它,而如果某个位是1,那么它之后的每个值全部可以变,前提是只需要它变成0。
所以,我们发现,对于第pos位来说,假如前面有mm个位是1:

ans+=∑ni=mCn−posi−m⋅[dp[i]==k−1]

这是因为,对于某个确定的位置,如果前面的部分已经全部确定,那么后面的部分就可以自由选择了。所以,后面的就可以用组合数去求!
还有一个问题,就是为什么我们只考虑某一位变成0后面的随意改变的情况。这是因为,这一位是1的情况我们在对这位之前的东西进行求解的时候已经处理过了。
而组合数怎么求?用递推法预处理:Cnm=Cn−1m−1+Cn−1mCmn=Cm−1n−1+Cmn−1。
还有三个特例需要注意:
如果1的位数的dp值恰是k−1k−1,那么结果还要加1。这是因为我们在枚举的时候已经忽略的第一位的情况,所以现在要再考虑进来。
如果k=0k=0,那么结果是0,因为1不在答案里。
如果k=1k=1,那么结果要-1,也是因为1不在答案里。

#include <bits/stdc++.h>
using namespace std;
#define LL long long
const LL MOD = (LL)1e9+7;
LL k, C[1003][1003], dp[1003], cnt, num;
string str;
inline int getbit(int x) {
    int ans = 0;
    while(x) {
        if(x & 1) ++ans;
        x >>= 1;
    }
    return ans;
}
int main() {
    cin>>str>>k;
    if(!k) return puts("1"), 0;
    for(int i = 0; i <= 1000; ++i)
        C[i][0] = 1;
    for(int i = 1; i <= 1000; ++i) {
        for(int j = 1; j <= 1000; ++j)
            C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % MOD;
    }
    dp[1] = 0;
    for(int i = 2; i <= 1000; ++i)
        dp[i] = dp[getbit(i)] + 1;
    int N = str.size();
    for(int i = 0; i < N; ++i) {
        if(str[i] == '0') continue;
        for(int j = max(1LL, cnt); j < N; ++j) {
            if(dp[j] == k - 1) {
                num = (num + C[N - 1 - i][j - cnt]) % MOD;
            }
        }
        ++cnt;
    }
    if(k == 1) --num;
    if(dp[cnt] == k - 1) num = (num + 1) % MOD;
    cout<<num<<endl;
    return 0;
}

感觉是很精妙的思想…原来这个就是数位DP吗(x

c#源码,将矩阵(二维数组)渲染成云图,强度图,热力图,均匀性图,伪彩图 优快云软件0积分下载链接:https://download.youkuaiyun.com/download/wanghuannihao1992/86656759。6、渲染效果良好,颜色均匀分布,不存在等高线,交叉点。3、纯粹的C#代码编写,不含第三方dll或者控件。4、支持ColorBar显示,强度值颜色坐标显示。2、渲染时间60ms左右,速度快,1、二维数据最小支持2*2,7、采样全新数据插值算法。先直接上C#软件效果图。5、整图保存为单个图片。 阅读详情

相关推荐

【UE5】VoskPlugin实战:离线语音识别与实时文本转换全流程解析

本文详细解析了如何在UE5中利用VoskPlugin实现离线实时语音转文字功能。从环境搭建、插件配置、核心代码编写到蓝图测试,提供了完整的实战教程。重点阐述了离线方案零延迟、数据私密的优势,并分享了模型选择、性能优化及常见问题的解决方案,帮助开发者快速构建稳定可靠的语音交互系统。

weixin_29001655的博客 621

codeforces914c

C. Travelling Salesman and Special Numbers time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output The Travelling Sa

yypurpose的博客 462

七步设计高频变压器

七步设计高频变压器

m0_71394959的博客 5402

【题解】Codeforces 458 Travelling Salesman and Special Numbers(数位DP)

题解:有题可知n是小于2的1000次方,那么表示成二进制最多就有1001位,那么就算取最大值,只需要改变一次就可以变成小于1001的数,那么我们就可以预处理出1001以内的所有数变成1的次数,然后用数位dp计算有多少数满足刚好改变k次就可以了。题意:给出一个二进制数n,问你有多少个小于n的数满足刚好改变(如下)k次变成1。如何改变:x变成x的二进制表示中1的数量。

wdnxmd的博客 156

LeGO-LOAM运行kitti数据集

文章目录1. kitti-lego-loam2. 改动3. 实验结果4. evo轨迹测评 1. kitti-lego-loam 链接:kitti-lego-loam kitti-lego-loam提供了将kitti序列转化成rosbag的代码,在kittibag中. 需要注意下数据文件的存放顺序,以00序列为例: datafolder          |____results          &

Zlp19970106的博客 8705

ubuntu20.04开机黑屏卡在/dev/sda1:clean,***files,***blocks,解决心得记录

这个问题如果你百度,会发现目前有很多种解决方法。 有更新显卡驱动的,有卸载上一次安装软件的,还有各种奇奇怪怪的故障原因。 如果你是属于上述情况,那么按照百度和论坛的各种指引操作一般都能解决。 但我这里主要说一种特殊情况,就是我什么也没有操作,我什么也没干。就是正常使用系统关了机突然就报错了。 这也是自己亲自遇到的问题,做个小记录方便以后自己回顾。 上一次出现这种情况我重装系统了,这次用了两个月又出现了,重装成本太高,我接受不了,于是找到解决办法。 首先找个终端进入,进入终端的方法很多,用安装u盘

qq_41517017的博客 2万+

codeforces 914C. Travelling Salesman and Special Numbers (DP + 组合数学)

传送门:codeforces 914C 题目大意: 定义一种 reduce操作为将一个数用其二进制下 1 的个数代替。给定一个二进制数 n,问小于等于 n的数中,需要进行 k次 reduce操作才能变为 1的数有多少个? 例如:7 -> 3 -> 2 -> 1 ,需要 3步。 思路: 首先观察到 n 的范围为: 1 5的时候结果都是 0 。因为大于 5

zuzhiang的博客 523

WGS-84 ECEF ENU 坐标系学习记录

地球坐标系固定在地球上而随地球一起在空间做公转和自转运动,因此地球上任一固定点在地球坐标系的坐标就不会由于地球旋转而变化。地心地固直角坐标系和大地坐标系都属于这种坐标系。 一、 几种坐标系 地心地固直角坐标系(ECEF)坐标系 其原点为地球的质心,x轴延伸通过本初子午线(0度经度)和赤道(0deglatitude)的交点。 z轴延伸通过的北极(即,与地球旋转轴重合)。 y轴完成右手坐标系,穿...

YYshuangshuang的博客 1万+

Codeforces 914C (数位dp)

题意:求小于n的并且恰好经过k次变化后成1的数的个数,变化规则为:x -> (x的二进制的1个数); 思路: 应为给出的数二进制位数最多为1000,所以1000 -> 10 -> 3 -> 2 -> 1,差不多就是这样,变化次数k在6以内。所以我们对1000打个表,表示成二进制1的位数为i的时候要经过多少次变成1。 接下来就是数位dp,其实就是记忆化搜索,加上是数位上的操作,称其为数位dp。

Everything can be done! 1053

Seurat 单细胞转录组测序数据分析教程(三)——python(scanpy)

文章参考至,做了一个更详细的解读。本教程探讨了 scanpy 的可视化可能性,分为三个部分:嵌入的散点图(例如 UMAP、t-SNE)使用已知标记基因鉴定簇差异表达基因的可视化在本教程中,我们将使用来自 10x 的数据集,其中包含来自PBMC的 68k 个细胞。Scanpy 在其分布中包括该数据集的简化样本,该数据集仅包含 700 个细胞和 765 个高度可变的基因。该数据集已经过预处理和 UMAP 计算。在本教程中,我们还将使用以下文献标记:B细胞:CD79A、MS4A1。

coffeeii的博客 5828

python爬取《你好, 李焕英》豆瓣评论数据

# 导入工具包 import requests from bs4 import BeautifulSoup import time import pandas as pd import numpy as np # 请求头 headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36'} # =

python技巧分享 3457

Codeforces 914 C. Travelling Salesman and Special Numbers (dp)

Description The Travelling Salesman spends a lot of time travelling so he tends to get bored. To pass time, he likes to perform operations on numbers. One such operation is to take a positive inte

小坏蛋_千千 729

AUTOSAE软件配置-项目标准配置 (PSC) 导入达芬奇( DaVinci Configurator)

文件是“可拆分的”,这意味着如果格式符合 AUTOSAR 拆分规则,则可以与其他。)是一个ARXML文件,主要由OEM提供,其中包含。)工件,可以作为输入文件导入到达芬奇配置器专业版。导入的参数将以只读方式处理。不允许在多个 ARXML 文件中导入一个。的已存在数据或从输入文件派生的数据。可以作为输入文件导入到另一个。文件会覆盖用户配置的基本。元素和诊断数据预配置。定义 [数据结构]。中,可以导出一个或多个。

m0_49148264的博客 1014

数位dp,CF 914C - Travelling Salesman and Special Numbers

所以我们只需计算出 [0, 1000] 的 f(),然后 对于 f(x) = k - 1的 x,我们找 [0, n] 之内 有多少数的pcnt = x,这件事情可以用数位dp轻松解决。我们注意到 虽然 n 很大,但是 对于 f(x) = k 的数字,其递推都是由 f(pcnt(x)) 转移,而pcnt(x) 很小,不超过1000。具体实现中,f() 我们可以初始化 f[0] = 1,从而原来的找 f(x) = k - 1 就 变为了 找 f(x) = k。那么 f(x) = f(pcnt(x)) + 1。

EQUINOX1的博客 540

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Codeforces 914C

题目链接:http://codeforces.com/contest/914/problem/C 题面:    题意: 给出一个数(二进制形式),每次将他变成他的二进制表示中1的个数, 问有多少个数可以正好在K此变化成为1。 题解: 首先用一个数组f记录下f[i]表示i这个数需要f[i]次变换成为1, 则有递推f[i] = f[__builtin_popcount(i)]. DP...

qq_36876305的博客 321

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Codeforces 914C - Travelling Salesman and Special Numbers 【思维】

Codeforces 914C - Travelling Salesman and Special Numbers 【思维】 Codecraft-18 and Codeforces Round #458 (Div. 1 + Div. 2, combined) memory limit per test      256 megabytes The Travelling Salesman spends a lot of time travelling so he tends to get bored. To

Dust_heart的博客 903

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

CodeForces - 914C(组合数学+dp)

Travelling Salesman and Special Numbers 题目传送门 题意:给一个数n(二进制表示)和k,要求你在[1,n]中找到特殊数字个数,特殊数字能经历k次operations转化得到1。One opertion:该数(二进制)中有X个1则转化为X(十进制)。 思路:n的范围超级大,但经过一次operation后缩小到[1,1000]以内,并且对于这个范围

siyu 875

codeforces 914c Travelling Salesman and Special Numbers

C. Travelling Salesman and Special Numberstime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputThe Travelling Salesman spends a lot of time travelling s...

C_K_Y_的博客 593

C. Travelling Salesman and Special Numbers (二进制 + 组合数)

对于n的二进制每一位1来说,如果这一位1变为0了,那么修改过的数无论后面所有位是0是1,都比原来的n小。所以可以先暴力求出1-1000中所有数分别需要多少次转换变为1,假设一个数x经过k次操作变为1,那么如果一个数经过k+1次操作变为1,其二进制中1的个数就为x。现在给定了操作次数为m,我们需要根据给出的n的二进制表达找到1-n中一共有多少数满足其二进制有v[0],v[1],v[2]…给出无前导零的二进制。...

Mr_dimple的博客 309

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

题意:题目中定义了一种运算,把数字x变成数字x的二进制位数。问小于n的恰好k次运算可以变成1的数的个数(题目中的n是二进制数,n最大到2^1000) 思路:容易发现,无论多么大的数,只要进行了一次运算,一定会变成1000以内的数,所以我们可以预处理1000以内的数经过多少次运算到1。之后,我们可以枚举1000以内的数字,枚举有哪些数字是经过k - 1次运算到1(假设此时数字是i),那么小于n的位...

weixin_30609287的博客 179

数论-Special Numbers

1.Fibonacci Number 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377, 610 … Formula: 2.Lucas Number 1, 3, 4, 7, 11, 18, 29, 47, 76, 123... Formula: 3....

weixin_30655219的博客 444

Codeforces Round #458 C Travelling Salesman and Special Numbers

题目链接:点击打开链接 题意:给定一种reduce操作(将某数置成其二进制表示下1的个数),某数reduce到1所需要的操作次数为其步长,给一个二进制数,要求求出小于该数且步长为k的所有数的个数模1e9+7。 思路:  注意到所有范围内的数的二进制表示下1的个数不会超过1000,所以所有数经一步操作后会落在1-1000范围内,同理,再操作一次会 落到1-10的范围,而1-10内步长最长的为

LFhase‘s Blog 1052

CF 458C. Travelling Salesman and Special Numbers 数位,公共前缀

题意:若一个数x其二进制表示中有y个位为1,则操作一次后:数x变成数y. 给出n(用二进制表示)和k 问[1,n]中有多少个数在操作k次后能变为1?   n 虽然n最大为2^1000 但任意一个数操作一次后 其范围在[1,1000] 令S为[1,n]操作一次后的集合,所以现在问题等价于S中有多少个数 操作k-1次后能变为1. 统计f[i]:表示数字i 操作几次变为1. 然

noone0的博客 338

CodeForces - 914C(DP+组合数)

链接:CodeForces - 914C 题目: C. Travelling Salesman and Special Numbers time limit per test 1 second memory limit per test 256 megabytes input standard input output standard

鬼沐冢 950

Codeforces#458 C.Travelling Salesman and Special Numbers

题目: http://codeforces.com/contest/914/problem/C 分析: 一次操作后,必定变为1000以内的数; 则先暴力处理出1000以内的合法数; 然后递推出组合数; 就能算啦; 注意k=1的时候,答案是 长度-1 代码: #include using namespace std; const int Tmax=1005; const lo

OI -> ACM -> AI 461

C. Travelling Salesman and Special Numbers

题目链接:http://codeforces.com/contest/914/problem/C 题意:有一个操作,可以使一个数字变成另一个数字,这个数字就是原数字二进制形式中1的个数。比如13的二进制位1101,有3个1,那么经过一次操作就变成了3,直到变为1为止,所经过的步数就是最小操作步数。 现在问1~n中有多少个数最小操作步数为k。 #include #include

wwwlps的博客 328
上一篇: luogu3194/BZOJ1007/HNOI2008 水平可见直线 单调栈/计算几何入门
下一篇: lyd读书笔记 0x01位运算
LittleRewriter
博客等级 码龄9年 35粉丝 60原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值