Numb 题解
前言
五一网课的例题,但是网上没有题解,所以来写一篇,就当攒 RP 了。题目可以在这里提交。原题是 Baekjoon - 19083,但是交不了?
题目简述
给你一个偶数 \(n\),求一个二进制数 \(x=\overline {a_1 a_2 \dots a_n}\),满足:
- \(x \equiv 0 \pmod{n}\);
- \(\forall i \in [1, n]\),\(\overline {a_1 a_2 \dots a_i} \bmod n\) 互不相同;
- 不含有前导 \(0\)。
题目分析
我不说的话,你能想到这是一道欧拉回路的题?
首先看到取模,前缀,很容易想到图论。点权是当前模 \(n\) 意义下的值,出边有两条分别是在当前缀后加上 \(0\) 或者 \(1\)。于是连边:
\(u \rightarrow 2u \bmod n\)
\(u \rightarrow 2u + 1 \bmod n\)
问题转变成了初始从 \(0\) 出发,不重不漏走过所有的点,最后在 \(0\) 处停下。所以这是一个哈密顿回路问题。
进一步分析图的性质,发现 \(u\) 和 \(u + \cfrac{n}{2}\) 连出去的点是一样的,所以看做一个大点,图上有 \(\cfrac{n}{2}\) 个大点,分别是 \(\left (0, \cfrac{n}{2} \right), \left(1, \cfrac{n}{2} + 1 \right), \ldots, \left(\cfrac{n}{2} - 1, n -1 \right)\)。每个大点有两条出边和两条入边。为了不重不漏地访问小点,我们可以不重不漏访问大点之间的边。所以就是一个简单的欧拉回路的问题了。至于不能有前导零,我们固定第一位是 \(1\) 就可以了。
代码
#include <cstdio>
#include <cstring>
#pragma GCC target("avx", "sse2", "sse3", "sse4", "mmx")
typedef unsigned int uint;
uint t, n, m, top;
bool vis[3000001][2];
bool ans[6000001];
inline uint add(uint a, uint b){
return a + b >= m ? a + b - m : a + b;
}
inline void dfs(uint now){
if (!vis[now][0]){
vis[now][0] = true;
dfs(add(now, now));
ans[++top] = 0;
}
if (!vis[now][1]){
vis[now][1] = true;
dfs(add(now, now + 1));
ans[++top] = 1;
}
}
inline void solve(){
scanf("%ud", &n), m = n >> 1, memset(vis, 0, sizeof (bool) * (n)), top = 0, vis[0][1] = 1, dfs(n == 2 ? 0 : 1), ans[++top] = 1;
for (register int i = top; i; --i) putchar(ans[i] | 48);
putchar('\n');
}
signed main(){
for (scanf("%ud", &t); t--; solve());
return 0;
}
checker.cpp
#include "testlib.h"
#include <vector>
signed main(int argc, char* argv[]) {
registerTestlibCmd(argc, argv);
int t = inf.readInt();
while (t--) {
int n = inf.readInt();
std::vector<bool> vis(n, false);
std::string str = ouf.readLine();
if (int(str.length()) != n) quitf(_wa, "You're too long or too short!");
for (int i = 1, now = 0; i <= n; ++i) {
char ch = str[i - 1];
if (ch != '0' && ch != '1') quitf(_wa, "Read '%c' not 0 or 1!", ch);
if (i == 1 && ch == '0') quitf(_wa, "There mustn't be any leading zeros!");
now = (now << 1 | (ch ^ 48)) % n;
if (vis[now]) quitf(_wa, "Found %d again!", now);
vis[now] = true;
if (i == n && now != 0) quitf(_wa, "The number is not divisible by n!");
}
}
ouf.readEof();
quitf(_ok, "I love yzh!");
return 0;
}
Numb 题解的更多相关文章
- POJ 2823 Sliding Window 题解
POJ 2823 Sliding Window 题解 Description An array of size n ≤ 106 is given to you. There is a sliding ...
- IOI2018题解
只有部分题解 练习赛 T2 自然还是要简单考虑了 0~n-1的排列,考虑相对的大小 我们先考虑对于前三个:a,b,c 询问a,b,询问b,c,再询问a,b,c 发现,如果三个知道两个,那么第三个可以唯 ...
- [BZOJ3523][Poi2014]KLO-Bricks——全网唯一 一篇O(n)题解+bzoj最优解
Description 有n种颜色的砖块,第i种颜色的砖块有a[i]个,你需要把他们放成一排,使得相邻两个砖块的颜色不相同,限定第一个砖块的颜色是start,最后一个砖块的颜色是end,请构造出一种合 ...
- 2017南开ACM校赛(网络赛) 民间题解
orz 首先说一下这个只是民间题解,可能会有很多错误 程序还没有评测,所以可能存在问题 C题比赛的时候没想到..后来发现是个模板题,所以没有代码 希望这份题解能对读者有所启发吧... A题 直接倒序枚 ...
- Codeforces Round #402 (Div. 2) 题解
Problem A: 题目大意: 给定两个数列\(a,b\),一次操作可以交换分别\(a,b\)数列中的任意一对数.求最少的交换次数使得任意一个数都在两个序列中出现相同的次数. (\(1 \leq a ...
- 2016年蓝桥杯B组C/C++决赛题解
2016年第七届蓝桥杯B组C/C++决赛题解 2016年蓝桥杯B组C/C++决赛题目(不含答案) 1.一步之遥 枚举解方程,或者套模板解线性方程 #include<bits/stdc++.h&g ...
- 【LeetCode/LintCode】 题解丨微软面试题:大楼轮廓
水平面上有 N 座大楼,每座大楼都是矩阵的形状,可以用一个三元组表示 (start, end, height),分别代表其在x轴上的起点,终点和高度.大楼之间从远处看可能会重叠,求出 N 座大楼的外轮 ...
- 题解 P5038 [SCOI2012]奇怪的游戏
题解 题目 做这题之前,做了一道叫星际战争的题,很容易想到二分 \(+\) 网络流,那么二分啥呢? 我们先推一下式子,因为是对相邻格子加数,那么可以联想到黑白染色类问题. 设有黑色格子 \(B\) 个 ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
随机推荐
- 30 岁的程序员,要有 "归零" 心态
大家好,我是码农先森. 古话说的 "三十而立",正是担重之时,却大部分人在职场中都处于不上不下的尴尬境地.已经没有刚毕业时那股子冲劲,被生活和工作磨平了棱角. 在技术思想方面,似乎 ...
- springboot项目添加logback日志
1.application.yml 配置日志文件路径: logging: config: classpath:logback.xml file: /usr/local/log/projectName/ ...
- Arduino实现温湿度传感器以及数据上传到云(乐维互联)
0 准备材料 0.1 ESP-01S 引脚及定义 官方定义: 序号 pin 功能 1 GND 地线 2 IO0/GPIO0 工作模式选择:①悬空:Flash Boot,工作模式 ②下拉:UART Do ...
- 使用vue-contextmenujs鼠标右键菜单时,当高度不够时显示不全的问题
之前是采用npm或者yarn直接装包vue-contextmenujs的形式: npm install vue-contextmenujs -S || yarn add vue-contextmenu ...
- RTThread 自动网卡使用问题
最近使用 STM32 测试了一下 lwip 和 esp8266 的网络连接问题,使用 RTThread 的自动网卡时,发现不能很好的自动切换默认网卡,不能满足需求,所以自己简单的改了一下. 一.准备材 ...
- 第三方App与Termux命令建立IO通道
目录 前言 一.Android 进程间通信(IPC) 二.Netcat 网络瑞士军刀 三.第三方 App 与 Termux 建立 TCP/Socket 通信 四.应用:调用 LSP 语言服务器 参见 ...
- debian12 创建本地harbor镜像库
前言 harbor是一个docker/podman镜像管理库,可用于存储私人镜像.现将本人在debian12系统搭建harbor镜像库的过程记录下来,留作后续参考. 可以参考github harbor ...
- spring cloud 上云的情况下,Ribbon 客户端负载均衡 与 ALB 服务端负载均衡的选择
在云环境(例如AWS)中,由于云提供商通常提供强大的负载均衡服务(如AWS的ALB),一般不再需要使用Ribbon这种客户端负载均衡方案.云环境中的负载均衡器通常能够提供更高的可靠性.可扩展性和简化的 ...
- 国内中文版的 Chātgpt,真的好赞。
这个软件是「Chātgpt」,Chātgpt 中文版是国内刚上线的一款人工智能技术的语言处理工具软件,它不仅可以学习和理解人类的语言来和人对话,还能撰写邮件.文案.翻译.代码等功能. 不需要OpenA ...
- Mysql实现主从复制(一主双从)
一.环境介绍 LNMP(centos7,mysql5.6) vmware workstation pro配置了3个虚拟机,均安装了LNMP环境: master: 192.168.0.105 slav ...