Travelling Salesman and Special Numbers
prologue
模拟赛的一道题,结果没做出来,丢大人,败大兴。所以过来糊一篇题解。
analysis
我们看到数据范围这么大,那么肯定不可以一个一个遍历(废话),所以就要考虑这个题目的性质。
我们先假设,极端数据 \(2 ^ {1000} - 1\),这个数字中包含了 \(999\) 个 1(正好感冒了能不能让我喝了)。下一次的数据就是 \(999\),这个时候,\(999\) 的二进制表示为 \(11 1110 0111\),下次就是 \(8\),再下次就是 \(1\) 了。这个时候的最少变换次数是 \(3\)。
我们看到这个数据缩小是很快的。那我们再进一步研究观察。
由于上限原因,所以我们第一次变换之后的数字一定为 \(\le 1000\) 的数字。我们又知道(不知道的掏计算器) \(2 ^ {10} = 1024\) 已经大于 1000 了,为了方便统计,适当放大数据。下次需要进行操作的数字就变成了 $ [0, 10] $ 就更小了,这个时候手搓一下,发现 \(7\) 这个数据是 \([0, 10]\) 之间的二进制表示下包含 1 最多的一个数字。
我们就求出来了这个恰好变换次数的上限。对于 100% 的数据而言,一定有:
- \(2 \le k \le 5\) 有解。
- \(k > 5\) 无解。
这个时候特判两个情况:
- \(k = 1\) 时,答案的个数为 \(length_s - 1\)。
- \(k = 0\) 时,答案为 1(只有 1 这种情况)。
我们之后就去考虑怎么计算这个值。
我们可以考虑一种类似于数位 dp 的思想,从高位往低位,用 \(f[i][j]\) 表示已经填了 i 个 1,剩下 j 位随便填,并且恰好 k 次变换之后能够变成 1 的方案数。
考虑递推式,从定义出发,预处理出来可能的值:
\]
\]
计算方案数量:
\]
注意,如果我们最后的这个数字符合我们的最后变换数量少一,就是最后可以变到 1,我们要给方案数加 1。
code time
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define rl register ll
#define endl '\n'
const ll N = 1010, P = 1e9 + 7;
char ch[N];
ll n, m, g[N], f[N][N];
int main()
{
scanf("%s%lld", ch, &m);
n = strlen(ch);
if(m == 0) puts("1");
else if(m == 1) cout << n - 1 << endl;
else if(m > 5) cout << "0" << endl;
else
{
for(rl i=2; i <= 1000; ++ i)
{
ll cnt = 0;
for(rl j=i; j; j >>= 1)
if(j & 1) cnt ++;
g[i] = g[cnt] + 1;
}
for(rl i=1; i <= n; ++ i) f[0][i] = g[i] == m - 1;
for(rl i=1; i <= n; ++ i)
for(rl j=0; j <= n; ++ j)
{
f[i][j] = f[i - 1][j];
if(j + 1 <= n) f[i][j] = (f[i][j] + f[i-1][j + 1]) % P;
}
ll res = 0, t = 0;
for(rl i=0; i < n; ++ i)
if(ch[i] == '1')
{
res = (res + f[n - i - 1][t]) % P; t ++ ;
}
if(g[t] == m - 1) cout << res + 1 << endl;
else cout << res << endl;
}
return 0;
}
Travelling Salesman and Special Numbers的更多相关文章
- Codeforces 914 C. Travelling Salesman and Special Numbers (数位DP)
题目链接:Travelling Salesman and Special Numbers 题意: 给出一个二进制数n,每次操作可以将这个数变为其二进制数位上所有1的和(3->2 ; 7-> ...
- Codeforces 374 C. Travelling Salesman and Special Numbers (dfs、记忆化搜索)
题目链接:Travelling Salesman and Special Numbers 题意: 给了一个n×m的图,图里面有'N','I','M','A'四种字符.问图中能构成NIMA这种序列最大个 ...
- 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 ...
- Travelling Salesman and Special Numbers CodeForces - 914C (数位dp)
大意: 对于一个数$x$, 每次操作可将$x$变为$x$二进制中1的个数 定义经过k次操作变为1的数为好数, 求$[1,n]$中有多少个好数 注意到n二进制位最大1000位, 经过一次操作后一定变为1 ...
- Codeforces 914C Travelling Salesman and Special Numbers (数位DP)
题意:题目中定义了一种运算,把数字x变成数字x的二进制位数.问小于n的恰好k次运算可以变成1的数的个数(题目中的n是二进制数,n最大到2^1000) 思路:容易发现,无论多么大的数,只要进行了一次运算 ...
- Codeforces 914C Travelling Salesman and Special Numbers:数位dp
题目链接:http://codeforces.com/problemset/problem/914/C 题意: 对数字x进行一次操作,可以将数字x变为x在二进制下1的个数. 显然,一个正整数在进行了若 ...
- 【Codecraft-18 and Codeforces Round #458 (Div. 1 + Div. 2, combined) C】 Travelling Salesman and Special Numbers
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 会发现. 进行一次操作过后. 得到的数字肯定是<=1000的 然后1000以下可以暴力做的. 则我们枚举第1步后得到的数字x是 ...
- HDU 5402(Travelling Salesman Problem-构造矩阵对角最长不相交路径)
Travelling Salesman Problem Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (J ...
- HDU 5402 Travelling Salesman Problem (构造)(好题)
大致题意:n*m的非负数矩阵,从(1,1) 仅仅能向四面走,一直走到(n,m)为终点.路径的权就是数的和.输出一条权值最大的路径方案 思路:因为这是非负数,要是有负数就是神题了,要是n,m中有一个是奇 ...
- HDOJ 5402 Travelling Salesman Problem 模拟
行数或列数为奇数就能够所有走完. 行数和列数都是偶数,能够选择空出一个(x+y)为奇数的点. 假设要空出一个(x+y)为偶数的点,则必须空出其它(x+y)为奇数的点 Travelling Salesm ...
随机推荐
- Uniapp下GoEasy通知栏推送不工作问题排查记录
我们是uniapp开发的app,项目中的系统消息推送使用的是GoEasy Websocket 实时推送,上线一段时间后,客户反馈说,当app没有在前台运行时也需要想办法通知用户一些重要的系统通知.那么 ...
- Mysql基础篇(四)之事务
一. 事务简介 事务是一组操作的集合,它是一个不可分隔的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败. 就比如:张三给李四转账1000块钱 ...
- Unity UGUI的Mask(遮罩)组件的介绍及使用
Unity UGUI的Mask(遮罩)组件的介绍及使用 1. 什么是Mask组件? Mask(遮罩)组件是Unity UGUI中的一个重要组件,用于限制子对象的可见区域.通过设置遮罩组件,可以实现一些 ...
- windows ce 5.0 + vs2005 + sql数据库_开发注意事项
今天通过对RFID读写器(windows ce 5.0)的摸索以及实验总结出一下注意事项: 安装 vs2005 后要配置windows ce 的开发环境,从网上下载对应设备版本的SDK,安装后新建项目 ...
- 分享一个Java功能小案例(代码已开源哦)
工程合集 工程列表 地址预览 B站 抖音
- 即构SDK9月迭代:外部采集、音频频谱、房间附加消息等多个模块功能上新
即构SDK9月迭代来了,本月SDK在外部采集.音频频谱.房间附加消息等多个功能模块均有新功能上线,并且还针对K歌音乐场景下,优化了变调功能效果.以下是详细的迭代内容: LiveRoom 新增 1. ...
- 路由分发admin源码
1. 不使用include方法 1.表象 另一种路由编写方式,不用使用include 引出namespace概念 可以看到如果使用include方法,后面可带上一个参数赋值给namespace 在无n ...
- Redis核心技术与实践 03 | 高性能IO模型:为什么单线程Redis能那么快?
原文地址:https://time.geekbang.org/column/article/268262 个人博客地址:http://njpkhuan.cn/archives/redis-he-xin ...
- Oracle备份与还原(实用版)
Oracle备份与还原 EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用. EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用,不能在客户端使用. I ...
- 为什么 PostgreSQL 的适用性很强?
说起使用数量最大的数据库SQLite 它是全球最广泛部署的数据库引擎.它存在于你的手机中,存在于你的浏览器中,如果你搜索你的电脑,你也会在其中找到它的 .db 文件.SQLite 受到 Postgre ...