CF542C题解

news/2024/10/4 18:06:01

传送门:https://codeforces.com/problemset/problem/542/C

我们把序列的映射关系看作\(i\rightarrow f(i)\)的边,要使\(f(f(i))=f(i)\),显然存在\(i\)点距离不超过\(1\)的长度为\(1\)的自环。

推广到\(f^{(k)}(x)\)满足题意则会在距离\(x\)点距离不超过\(k\)的长度为\(k\)的环。我们要使\(f^{(k)}(x)=f^{(k)}(\ f^{(k)}(x))\),成立,当前仅当存在一个长度为\(z\)的环,与$\ x\ \(联通且距离不超过\)k\(。且\)k|z\((因为需要绕一圈回到原点)。我们要使此关系对于任意\)x\(成立,则最小\)k\(为所有环长度的最小公倍数,若\)k\(小于所有点与最近环的距离,则需要将答案倍乘到\)≥$此距离。

可以\(O(n)\)预处理所有环以及每个点与环的距离,具体见以下答案。总时间复杂度\(O(nlog_2{n})\),瓶颈在于最大公约数。

#include <bits/stdc++.h>#define int long long
using namespace std;inline int read() {char c;bool flag = false;while ((c = getchar()) < '0' || c > '9') if (c == '-') flag = true;int res = c - '0';while ((c = getchar()) >= '0' && c <= '9') res = (res << 3) + (res << 1) + c - '0';return flag ? -res : res;
}const int N = 201;struct Edge {int v, next;
} e[N];int head[N], cnt;void add(int u, int v) {e[cnt].v = v;e[cnt].next = head[u];head[u] = cnt++;
}int dis[N], c, b, flag, len[N], vis[N], v;void dfs(int x) {if (vis[x] && vis[x] != v) return;if (vis[x] && vis[x] == v) {b = x;flag = 1;++c;return;}vis[x] = v;for (int i = head[x]; ~i; i = e[i].next) dfs(e[i].v);if (x != b && flag) ++len[c];if (x == b) {++len[c], flag = 0, b = 0;return;}if (!flag) dis[x] = dis[e[head[x]].v] + 1;
}int gcd(int aa, int bb) { return bb ? gcd(bb, aa % bb) : aa; }signed main() {memset(head, -1, sizeof head);int n = read();for (int i = 1; i <= n; ++i) {int u = read();add(i, u);}for (int i = 1; i <= n; ++i) if (!vis[i]) ++v, dfs(i);int mx = 0;for (int i = 1; i <= n; ++i) mx = max(mx, dis[i]);int ans = len[1];for (int i = 2; i <= c; ++i) ans = ans / gcd(ans, len[i]) * len[i];if (mx > ans) printf("%lld", mx % ans ? ans * (mx / ans + 1) : mx);else printf("%lld", ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/67725.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

第八届2024御网杯WP

WEBinput_data使用工具https://github.com/kost/dvcs-ripper./rip-svn.pl -u http://101.200.58.4:10005/.svn下载下来.svn目录然后查看结构发现几个文件cd进去目录,然后cat 文件名字即可看到 flag{5674938f-803d-4c41-8f84-a77f5164bb4f}Flag: flag{5674938f-803d-4c41-8f84…

给PbootCMS增加换行标签br=1

在 PbootCMS 中,如果你需要在前端显示一个包含换行符的简介字段,并且希望这些换行符能够正确显示为 HTML 中的换行,可以通过自定义解析器来实现这一功能。以下是详细的步骤: 步骤 1: 修改 ParserController.php 文件打开文件: 打开 \apps\home\controller\ParserControlle…

pbootcms如何显示按文章内容搜索,而不是搜索标题

在 PbootCMS 中,默认情况下搜索功能通常是基于文章标题进行的。如果你想让搜索功能基于文章内容进行,可以通过以下步骤实现: 步骤 1: 修改搜索表单 在搜索表单中添加一个隐藏字段 field,并将它的值设为 content。这样可以让系统知道搜索时应该针对文章内容进行匹配。 修改后…

PbootCMS文章列表序号怎么写?

根据你提供的信息,我们可以进一步了解如何使用 pboot:list 标签,并结合 [list:n]、[list:i] 和 [list:id] 进行一些实用的功能实现。下面是一些具体的示例和应用场景: 1. 显示列表序号 假设我们需要显示一个列表,并且希望序号从 0 开始:html{pboot:list num=10} <li>…

PbootCMS隐藏指定 scode 的菜单各种条件判断和标签

{pboot:nav} <li {pboot:if([nav:scode] == 2 || [nav:scode] == 4 || [nav:scode] == 6)}style="display: none;"{/pboot:if}><a href="[nav:link]">{nav:name}</a> </li> {/pboot:nav}扫码添加技术【解决问题】专注中小企业网站…

PbootCMS判断导航从第几个开始各种条件判断和标签

{pboot:nav} {pboot:if([nav:i] > 2)} <li><a href="[nav:link]">{nav:name}</a></li> {/pboot:if} {/pboot:nav}扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascript等。…

PbootCMS导航栏 logo 居中判断各种条件判断和标签

{pboot:nav} <a href="[nav:link]">{nav:name}</a> {pboot:if([nav:i] == 3)} <img src="{pboot:sitelogo}" /> {/pboot:if} {/pboot:nav}扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HT…

PbootCMS判断列表页有无内容,无内容返回提示各种条件判断和标签

{pboot:if({page:rows} > 0)} <div class="page"><a href="{page:index}">首页</a><a href="{page:pre}">上一页</a>{page:numbar}<a href="{page:next}">下一页</a><a href="{…