【xsy1281】 珠串 打表+乱搞or数位dp
题目大意:你要找出一个有$k$个的本质不同的$n$位二进制数的集合,使得集合中最大的数最小,请输出这个数
本质不同定义:对于一个数$k$,$rev(k)$,$~k$,$rev(~k)$与$k$本质相同。其中$~k$表示对$k$的每一位二进制翻转,$rev(k)$表示对$k$左右翻转。
举个例子:对于数0001,它与1000,1110,0111本质相同。
数据范围:$n≤25,k≤10^{16}$。
此题貌似正解是数位dp,然而我比较菜。
看到这一题:打表啊!
于是打了个表,发现:
若$k≤2^{\lceil \frac{n}{2} \rceil}-2$,则直接输出$k$就可以了,证明显然。
若$k>2^{\lceil \frac{n}{2} \rceil}-2$
先考虑$n$为偶数的情况,我们打一个表,打出所有满足$rev(x)<x$或$(~x)<x$或$rev(~x)<x$的数,大概长这样
我们发现:以中间的分界线为界,当左侧构成的数去掉前导零后构成$x$,那么以$x$开头的不符合要求的二进制数就有$2x$个。
(感兴趣的同学可以证明一下,我懒得证了23333)
我们基于这一个特征,先确定这个二进制数的前$\frac{n}{2}$位。
后面的$\frac{n}{2}$位直接暴力枚举然后再随便判断一下就好了。
n为奇数的情况相似
以中间为分界线,当右侧横线左侧的数为$x$时,以$x$为前缀的$n$位二进制数有$x$个。
和之前的搞法一样随便搞一搞就可以了。
时间复杂度:$O(2^{n/2})$,空间复杂度:$O(2^{n/2})$。
- #include<bits/stdc++.h>
- #define L long long
- using namespace std;
- int rev[<<]={};
- L n,k;
- void out(L k1){for(L i=;i<n;i++) printf("%d",bool((1LL<<(n-i-))&k1));}
- void SolveEven(){
- L n2=n/,s=<<n2,all=1LL<<n;
- if(k<s){
- out(k);
- return;
- }else k-=s;
- for(int i=;i<s;i++) rev[i]=(rev[i>>]>>)|((i&)?(s>>):);
- for(int i=,j=;i<s;i++,j+=){
- if(k>=s-j) k-=s-j;
- else{
- int p; for(p=;p<s&&k>=;p++){
- L k1=(1LL*i)<<n2|p;
- L k2=(1LL*rev[p])<<n2|rev[i];
- L k3=(1LL*rev[(s--p)&(s-)])<<n2|rev[s--i];
- if(k2>=k1&&k3>=k1)
- k--;
- }
- L k1=(1LL*i)<<n2|(p-);
- out(k1);
- return;
- }
- }
- cout<<-<<endl;
- }
- void SolveOdd(){
- L n2=n/,s=<<n2,all=1LL<<n;
- L N2=(n+)/,S=<<N2;
- if(k<S-){
- out(k);
- return;
- }else k-=S-;
- for(int i=;i<s;i++) rev[i]=(rev[i>>]>>)|((i&)?(s>>):);
- for(int i=,j=;i<s;i++,j++){
- if(k>=s-j) k-=s-j;
- else{
- int p; for(p=;p<s&&k>=;p++){
- L k1=(1LL*i)<<n2|p;
- L k2=((i&)<<n2)|((1LL*rev[p])<<N2)|rev[i>>];
- L k3=(((i&)==)<<n2)|((1LL*rev[(s-p-)&(s-)])<<N2)|rev[s--(i>>)];
- if(k2>=k1&&k3>=k1)
- k--;
- }
- L k1=(1LL*i)<<n2|(p-);
- out(k1);
- return;
- }
- }
- cout<<-<<endl;
- }
- int main(){
- cin>>n>>k;
- if(n&) SolveOdd();
- else SolveEven();
- }
【xsy1281】 珠串 打表+乱搞or数位dp的更多相关文章
- 学渣乱搞系列之dp斜率优化
学渣乱搞系列之dp斜率优化 By 狂徒归来 貌似dp的斜率优化一直很难搞啊,尤其是像我这种数学很挫的学渣,压根不懂什么凸包,什么上凸下凸的,哎...说多了都是泪,跟wdd讨论了下,得出一些结论.本文很 ...
- 老哥们,请问我做的对么?(记一次失败的st表乱搞)
今天a开始就不是很顺,然后到d,d努力读完题理解完题意,感觉自己又行了{ 问最大的jump,我觉得如果单纯贪心策略显然会t,问min,max这类rmq果断上了st表(这东西我隔离的时候写的,没想到被拉 ...
- 关于一道你们眼中的水题 Windy数 的乱写(数位dp)
啊一道水题有什么好说的 上课听不懂,下课泪两行. 有的人什么套路都会,我.. 只能可怜巴巴的抄代码,然后自己总结,顺(zhu)便(yao)颓博客 1.递推dp的思路做到一半死了,怎么也想不出来如何处理 ...
- HDU3652 B-number(数位DP)题解
思路: 这里的状态分为3种,无13和末尾的1,无13且末尾为1,有13,然后DFS 等我搞清楚数位DP就来更新Orz 代码: #include<iostream> #include< ...
- HDU XXXX:求[L,R]的素数数量(数位DP)
Problem G Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/131072K (Java/Other) Total S ...
- hash进阶:使用字符串hash乱搞的姿势
前言 此文主要介绍hash的各种乱搞方法,hash入门请参照我之前这篇文章 不好意思hash真的可以为所欲为 在开头先放一下题表(其实就是我题解中的hash题目qwq) 查询子串hash值 必备的入门 ...
- Luogu P1134 阶乘问题 【数学/乱搞】 By cellur925
输入输出格式 输入格式: 仅一行包含一个正整数 NN . 输出格式: 一个整数,表示最右边的非零位的值. 输入输出样例 输入样例#1: 12 输出样例#1: 6 说明 USACO Training S ...
- 2016 10 28考试 dp 乱搞 树状数组
2016 10 28 考试 时间 7:50 AM to 11:15 AM 下载链接: 试题 考试包 这次考试对自己的表现非常不满意!! T1看出来是dp题目,但是在考试过程中并没有推出转移方程,考虑了 ...
- bitset 的妙用:乱搞字符串匹配
最近碰到了几次 bitset 乱搞字符串匹配的情况,故写文以记之. 1. 算法简介 核心思想:假设文本串为 \(s\),则对字符集中的每一个字符 \(c\) 开一个大小为 \(|s|\) 的 bits ...
随机推荐
- warning: this decimal constant is unsigned only in ISO C90问题的处理及理解
参考:https://blog.csdn.net/duguduchong/article/details/7709482 https://bbs.csdn.net/topics/391892978?p ...
- linux命令tee用法
功能说明:读取标准输入的数据,并将其内容输出成文件. 语 法:tee [-ai][--help][--version][文件…] 补充说明:tee指令会从标准输入设备读取数据,将其内容输出到标准输出设 ...
- SQL之GROUP BY 语句
合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句. GROUP BY 语句 GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组. SQL GROUP BY 语法 ...
- 在vue中没有数据的渲染方法
1.例如在评论区中,评论一般分为两种形式,一种是有评论,一种是没有评论, 用v-if进行判断,判断的是评论的长度,此时评论的数据应为数组 2.可以computed中记性计算后进行数据的返回在用v-if ...
- javascript 连等赋值问题
var a = {n:1}; var b = a; // 持有a,以回查 a.x = a = {n:2}; alert(a.x);// --> undefined alert(b.x);// - ...
- FreeMarker 处理不存在的变量
FreeMarker不能容忍引用不存在的变量,除非明确地告诉它当变量不存在时如何处理.这里介绍两种典型的处理方法. 一个不存在的变量和一个是null的变量,对于FreeMarker来说是一样的. 处理 ...
- Ubuntu下配置PHP和CakePHP记录
目前在完成一个PayPal的支付页面,需要有PHP的开发环境,同时,在开发时使用了CakePHP的框架,于是就有了下面的情景. 操作环境: OS:ubuntu-14.04.2-desktop-amd6 ...
- 《深入浅出MFC》系列之运行时类型识别(RTTI)
/********************************************************************************** 发布日期:2017-11-13 ...
- 1.2.2实现Runnable接口
使用Runnable创建线程 package com.cky.runner; /** * Created by chenkaiyang on 2017/12/2. */ public class My ...
- Forward团队-爬虫豆瓣top250项目-需求分析
一. 需求:1.爬取豆瓣电影top250. 2.获取电影名称,排名,分数,简介,导演,演员. 3.将爬取到的数据保存,以便随时查看. 3.可以将获取到的数据展示给用户. 二. 参考: 豆瓣api参考资 ...