「SOL」Hamiltonian Cycle (AtCoder)
原来一般的四度图也没法快速构造哈密顿回路 QwQ
# 题面
给定质数 \(P\) 和正整数 \(a,b\),构造一个长为 \(P\) 的数列 \(G=(g_1,g_2,\dots,g_P)\),满足:
- \(g_1=g_P=1\);
- \((g_1, g_2,\dots,g_{P-1})\) 是 \(1\sim P-1\) 的排列;
- \(\forall 1\le i\le P-1\),\(g_i\) 和 \(g_{i+1}\) 满足下述关系之一:
- \(g_i=ag_{i+1}\);
- \(ag_i=g_{i+1}\);
- \(g_i=bg_{i+1}\);
- \(bg_i=g_{i+1}\)。
判断是否有解,若有解,给出任意一组。
数据规模:\(P\le10^5,1\le a,b\lt P\)。
# 解析
转化为图论问题,若 \(i, j\) 满足题面所述的性质,则在 \(i, j\) 之间连边。需要找到一条哈密顿回路(经过所有点恰好一次)。显然这个图的每个点度数都是 \(4\),虽然没什么用。
不额外说明的话,以下的计算均是在模 \(P\) 意义下的。
\(P\) 是质数,意味着 \(a,b\) 都有逆元,进一步意味着「将 \(i\) 与 \(a\cdot i\) 连边」会得到若干个大小为 \(\mathrm{ord}_a\) 的环。
结论
令 $n=\mathrm{ord}_a$,数集 $H=\{a^i\mid i\in \mathbb Z\}$,$m$ 为满足 $b^{m_0}\in H$ 且 $m_0\ge 1$ 的最小 $m_0$。
则问题有解当且仅当 $nm = P - 1$;若 $nm = P - 1$,则 $\forall 1\le x\le P - 1$,存在唯一的 $i \in [0, n), j \in [0, m)$,使得 $x = a ^ i b ^ j$。
根据定义,下述结论是显然成立的:
$$
\{a ^ i b ^ j \mid i, j \in \mathbb Z\}=\{a ^ i b ^ j \mid i \in [0, n), j \in [0, m), i,j \in \mathbb Z\}
$$
原问题有解的必要条件是
- \(\forall 1\le x\le P - 1\),\(\exists i, j \in \mathbb Z, x = a ^ i b ^ j\);
即
&\{x\mid 1\le x\le P - 1\}=\{a ^ i b ^ j \mid i, j \in \mathbb Z\}=\{a ^ i b ^ j \mid i \in [0, n), j \in [0, m)\}\\
\Rightarrow&\Big|\{x\mid 1\le x\le P - 1\}\Big| = \Big|\{a ^ i b ^ j \mid i \in [0, n), j \in [0, m)\}\Big|\\
\Rightarrow&P-1=nm
\end{aligned}
\]
必要性得证。下证上述结论中的第二条,即可构造出一组解,从而证明充分性。
下述 \(a\) 的指数上的运算在模 \(n\) 意义下,\(b\) 的指数上同理在模 \(m\) 意义下。
每个数都能表示成 \(a^ib^j\) 的形式,存在性显然;只需证明唯一性。假设存在一个 \(x\in[0,P)\),使得 \(x=a^ib^j=a^pb^q\)(\(a,p\in[0,n)\),\(b,q\in[0, m)\)),则
\]
若 \(j\neq q\),则 \(0\lt q-j\lt m\),根据「\(m\) 是最小的满足 \(b^m\in H\) 的正整数」,\(b^{q-j}\neq a^{i-p}\)。矛盾,则 \(j=q\)。
\]
若 \(i\neq p\),则 \(0\lt i - p\lt n\),根据「\(n\) 是最小的满足 \(a^n=1\) 的正整数」,\(a ^ {i - p} \neq 1\)。矛盾,则 \(i = p\)。
所以 \(i, j\) 具有唯一性。
于是我们可以用 \(a ^ i b ^ j\)(\(i \in [0, n), j \in [0, m)\))唯一表示 \(1 \sim P - 1\) 的数,可以按照下述方式构造 \(n \times m\) 的表格:
- 第 \(i\) 行第 \(j\) 列放置数 \(a ^ {i - 1} b ^ {j - 1}\)。
\(1 \sim P - 1\) 在表格上恰好出现了一次,且表格上相邻的两个数都有边相连 —— 所以这是一个网格图。
再分析,\(P - 1\) 是偶数,\(nm = P - 1\),\(n, m\) 至少有一个是偶数。行和列至少有一个是偶数的网格图可以直接构造哈密顿回路,可以求解,也证明了结论的充分性。
# 源代码
/*Lucky_Glass*/
#include <cstdio>
#include <cstring>
#include <algorithm>
#define con(typ) const typ &
const int N = 1e5 + 10;
int mod, va, vb, n, m, nans;
bool vis[N];
int ans[N], powa[N], powb[N];
inline int mul(con(int) a, con(int) b) {return int(1ll * a * b % mod);}
int main() {
scanf("%d%d%d", &mod, &va, &vb);
vis[1] = true;
n = m = 1;
for (int tmp = va; tmp != 1; ++n, tmp = mul(tmp, va))
vis[tmp] = true;
for (int tmp = vb; !vis[tmp]; tmp = mul(tmp, vb), ++m) ;
if ( mod - 1 != 1ll * n * m ) {printf("No\n"); return 0;}
if ( n & 1 ) std::swap(va, vb), std::swap(n, m);
powb[0] = powa[0] = 1;
for (int i = 1; i < n; ++i) powa[i] = mul(powa[i - 1], va);
for (int i = 1; i < m; ++i) powb[i] = mul(powb[i - 1], vb);
ans[++nans] = 1;
for (int i = 0, tmp = 1; i < n; ++i, tmp = mul(tmp, va))
if ( i & 1 )
for (int j = m - 1; j; --j)
ans[++nans] = mul(tmp, powb[j]);
else
for (int j = 1; j < m; ++j)
ans[++nans] = mul(tmp, powb[j]);
for (int i = n - 1; ~i; --i)
ans[++nans] = powa[i];
printf("Yes\n");
for (int i = 1; i <= nans; ++i) printf("%d%c", ans[i], i == nans ? '\n' : ' ');
return 0;
}
THE END
Thanks for reading!
满眼繁星占领我内心
撑起腐朽夜空
手点着微芒 想照亮那隐约角落
转瞬即逝 如烟火抱憾落幕
将我隐藏 成为星空崭新的孤岛
——《一封孤岛的信》 By 著小生 / 洛天依
> 一封孤岛的信 - Bilibili
「SOL」Hamiltonian Cycle (AtCoder)的更多相关文章
- 一本通1648【例 1】「NOIP2011」计算系数
1648: [例 1]「NOIP2011」计算系数 时间限制: 1000 ms 内存限制: 524288 KB [题目描述] 给定一个多项式 (ax+by)k ,请求出多项式展开后 x ...
- 【LOJ】#3094. 「BJOI2019」删数
LOJ#3094. 「BJOI2019」删数 之前做atcoder做到过这个结论结果我忘了... em,就是\([1,n]\)之间每个数\(i\),然后\([i - cnt[i] + 1,i]\)可以 ...
- 「SCOI2016」背单词
「SCOI2016」背单词 Lweb 面对如山的英语单词,陷入了深深的沉思,「我怎么样才能快点学完,然后去玩三国杀呢?」.这时候睿智的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,然后 ...
- loj2009. 「SCOI2015」小凸玩密室
「SCOI2015」小凸玩密室 小凸和小方相约玩密室逃脱,这个密室是一棵有 $ n $ 个节点的完全二叉树,每个节点有一个灯泡.点亮所有灯泡即可逃出密室.每个灯泡有个权值 $ A_i $,每条边也有个 ...
- 「AGC020F」 Arcs on a Circle
「AGC020F」 Arcs on a Circle Link 这个题非常 Amazing 啊.果然AtCoder全是智商题 首先你可以注意到数据范围真的是小得离谱,让你想要爆搜. 然后你发现不可做, ...
- 「译」JUnit 5 系列:条件测试
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- JavaScript OOP 之「创建对象」
工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...
- 「C++」理解智能指针
维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...
- 「JavaScript」四种跨域方式详解
超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...
随机推荐
- mysql查询数据是否连续增长
记录一次比较查询,需求是比较内容是否一次比一次高,用来作为标签依据 大致问题如下 简化: 班级中有若干人,若干次考试.需要查询某人在考试时成绩越来越好(分数是每次都有增长) 思路: 1.使用group ...
- java对excel的操作
1.对比任意两张excel表是否有不同行 并输出哪一行那一列不同 2.包含解析合并单元格方法 3.比较主要思路 a.解析excel: b.遍历第一张表数据所有行 c.遍历第二张表数据所有行 d.遍历第 ...
- [3] ScanRefer论文精读 3DVisual Grounding开山之作
论文名称:ScanRefer: 3D Object Localization in RGB-D Scans using Natural Language 这篇文章最主要的工作,我觉得是两个,第一,提出 ...
- css可继承与不可继承的属性
一.可继承性的属性 字体相关的:font-size/font-family/font-weight/font-style/font-variant/font-stretch 文本相关的:color/t ...
- 由于CVE-2020-10770漏洞,k8s集群升级keycloak 8.0.0-->15.0.0(由于15.0.0最近又出安全漏洞,升级为16.0.0)
背景 前段时间项目组用到的8.0.0版本的keycloak被安全部门同事扫出来一个中危漏洞: A flaw was found in Keycloak, where it is possible to ...
- [js函数] shallowEqual
const isBasicType = (t: any) => { return t === "number" || t === "string" || ...
- C# 当页面有很多选择条件时的处理方式
如下图,用户可能输入很多条件 在后端的处理方式: 使用键值对 private Dictionary<string, string> CreatSearchPara() { Dictiona ...
- Qt学习笔记(一) 关于QWidget类的paintEvent方法
今天要讨论的也算是QT的核心之一了,那就是如何对widget进行重绘,这里就是可以看到,继承了QWidget的子类,自己重新写一个paintEvent函数就可以了. 这个paintEvent就相当于是 ...
- Oracle View的 WITH READ ONLY 參數有什麼用途?
限制此視圖只能select,不能進行DML(update,delete,insert)操作,可以保護源表的數據不被改動. CREATE VIEW XXXXX_V AS select XXX,XXX1, ...
- wpf treeview 选中节点加载数据并绑定
<TreeView Grid.Row="0" Grid.Column="0" x:Name="FolderView" Canvas.T ...