• 很好的一道题,即使是我这种菜鸡也感到心潮澎湃。

  • 直觉有余,证明不足。思路有余,推导不足。

  • 无论是什么比赛,对拍都是最有效的查错方式。

  • 本篇题解里的所有图片采用 graph_editor 制作。


题意简述

给你一张没有边的,\(n\) 个点的图,点的编号从 \(0\) 到 \(n-1\),再给你一个参数 \(k\)。你可以执行以下操作任意次:

  • 选择点 \(u\) 和点 \(v\),将其连边,并且将 \((u+k) \mod n\) 与 \((v+k) \mod n\) 连边。

你需要在第一行输出你的操作次数 \(m\),在第 \(2\) 到 \(m+1\) 行输出你每次操作选择的 \(u\) 和 \(v\),使得经过你的操作,这张图变为无重边,无自环的一棵树。

思路整理

在以下的推导中,我们设 \(to_i=(i+k) \mod n\),\(p=gcd(n,k)\)。

你发现,如果 \(n\) 为偶数,必然无解。因为每次加入两条边,不可能产生奇数条边。

对于奇数,你想到了这样一种形式:将 \(0\) 和 \(to_0\) 连边,这时 \(to_0\) 会与 \(to_{to_0}\) 连边。之后将每个点 \(u\) 与 \(0\) 连边,此时 \(to_u\) 会与 \(to_0\) 连边。每次新加两个点,一开始有三个点。这样加下去总能满足条件。这看上去很对,你很高兴,认为今天能上大分。

显然电脑很不高兴,她给你这样一组数据:\(n=15,k=6\)。

你把图画出来,发现有一丝不对劲:

少了两个点!\(13\) 本来要和 \(7\) 对 \(0\) 和 \(1\) 连边,但 \(7\) 被 \(5\) 抢了!

你转念一想:我直接让 \(5\) 跟 \(7\) 连边,那么 \(13\) 就会与 \(7\) 连边。问题似乎被解决了!

然后你造出来了 \(p\) 条链。

你很不高兴,决定将这 \(p\) 条链连起来。

你试着将 \(0\) 和 \(1\) 连起来,发现 \(to_0\) 和 \(to_1\) 也连了起来。这就是个环了,于是你决定将 \(1\) 所在的那条链全断开。

这种方案有两个问题:

  1. 最后一行没人管
  2. 最后一列没人管

你试图将两个没人管的东西连起来: \(10\) 和 \(11\),然后会连上 \(1\) 和 \(2\)。。。成了!

如果有更多列呢?那就多做几遍!

这里提供一份 \(n=35,k=7\) 的答案图。

作为一个精益求精的人,你想要证明当 \(n\) 为奇数时都能构造出上面的树。

你发现,构造出这个树的条件为每条链的节点数为奇数,且有奇数条链。

显然,当 \(n\) 为奇数时 \(p\) 为奇数。第一条链的节点集合 \(S\) 为 \(0,p,2p,...,(n/p-1)*p\)。总共 \(n/p\) 个点。奇数被奇数整除得奇数

所以,第 \(i\) 条链可以表示为 \(0+(i-1),p+(i-1),...(n/p-1)+(i-1)\)。起点从 \(0\) 到 \(p-1\) 都有可能,所以总共有 \(p\) 条链。为奇数。

你很高兴,上了大分。因为这一场有许多人都被小学追及问题难住了。

代码很短,不给代码。

[ARC152D] Halftree题解的更多相关文章

  1. ARC145~152 题解

    比赛标号从大到小排列 . 因为博主比较菜所以没有题解的题都是博主不会做的 /youl ARC144 以前的比赛懒得写了 . 目录 AtCoder Regular Contest 152 B. Pass ...

  2. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  3. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  4. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  5. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  6. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  7. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  8. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  9. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  10. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. java.lang.NoSuchMethodException: com.titan.domain.BigPackage.setEMail(java.lang.String)

    List<Map<String, Object>> list 转 List<Bean>报异常. ... Method method = classType.getM ...

  2. Loadrunner——调试及脚本编译

    调试一般用于运行代码是出现的错误. loadrunner调试方式:断点.单步跟踪.日志输出.值查看器等, 断点设置 断点插入的位置:非空行或非语句的起始,简单来说呢就是断点打在函数前(取消断点就直接在 ...

  3. 使用dumpbin查看dll文件中的api

    一.找到vs自带的dumpbin 我的目录如下: C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14 ...

  4. PyCharm 取消单词拼写检查

    在使用PyCharm的时候,有时候变量不符合规范比如"old_pwd"写成了"oldpwd" ,在变量下就会出现波浪线,比较烦人 去除这个拼写检查的地方是:Fi ...

  5. 人森第一个iOS app,写给我家baby的!纪念一下

    用python写的,对于非专业iOS开发来说,py是个不错的选择,使用beeware框架,感觉和写前端差不多

  6. Git简介及使用

    1.Git简介 GIT= 版本控制 + 备份服务器 我们称用来存放上传档案的地方就做Repository.用中文来说,有点像是档案仓库的意思. 不过,通常我们还是使用Repository这个名词.当有 ...

  7. linux安装mongo-c-driver

    yum install mongo-c-driver sudo yum install cmake openssl-devel cyrus-sasl-devel $ wget https://gith ...

  8. 8css 盒子模型

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. springmvc拦截器的简单创建

    找到前端控制器配置文件: 配置拦截器: 实现接口,定义自己的规则:

  10. logging 模块详解

    日志记录函数以它们用来跟踪的事件的级别或严重性命名.下面描述了标准级别及其适用性(从高到低的顺序) 日志等级(level) 描述DEBUG 最详细的日志信息,典型应用场景是 问题诊断INFO 信息详细 ...