首页 > 其他分享 >CF542C 解题分析

CF542C 解题分析

时间:2023-06-19 18:56:44浏览次数:30  
标签:分析 结点 num int vis 解题 CF542C lcm dis

1 题目大意

1.1 题目翻译:

给定一个值域为 \([1,n]\) 的函数 \(f(x)\),让你求出最小的 \(k\),其中 \(k\) 满足 \(f^{(2k)}(x) = f^{(k)}(x)\)。

其实我觉得这题你谷翻译十分到位,建议没读懂题的还是去看你谷翻译罢。

1.2 数据范围:

对于 \(100\%\) 的数据:

  • \(1 \leq n \leq 200\)

1.3 *关于数据范围

这个 \(n\) 其实可以开到 \(2 \times 10^5\) 的,但前提是你得加一个高精度。出题人好仁慈,拜谢出题人。

2 解法分析

发现出现了 \(f^{k}(x)\) 这种东西,不难想到建图。

我们可以把 \(x\) 向 \(a_x\) 连一条有向边。不难发现,整个图被分成了多个连通块,每一个连通块都形似基环树。我们可以把每一个环的大小和一个点到环的最短距离算出来。

现在,我们分两种情况讨论。设答案为 \(k\):

  • 如果结点 \(u\) 在环中,设这个环大小为 \(s\),那么这个结点必须绕至少 \(s\) 次才能出现相等。所以,\(s \ | \ k\)。

  • 如果结点 \(u\) 不在环上,设这个结点到环的最短距离为 \(d\),那么这个结点只有走至少 \(d\) 次才能到环。所以,\(k \geq d\)。

于是,答案就简单了。我们把所有环的大小取最小公倍数 \(\operatorname{lcm}\),然后算出第二种结点 \(d\) 的最大值 \(p\)。如果 \(p \leq \operatorname{lcm}\),那么就成立;否则,还要用带余除法计算出最小的 \(w\),满足 \(w \cdot \operatorname{lcm} >= p\)。此时,\(w \cdot \operatorname{lcm}\) 即为答案。

3 AC Code

代码丑的要死,将就着看吧。

int dfs(int x) {
    if (vis[x])
        return dis[x];
    vis[x] = 1;
    dfn[x] = ++ timetmp;
    int num = dfs(a[x]);
    if (vis[a[x]] == 1)
        p = a[x], num = dfn[x] - dfn[p] + 1;
    else if (cycle[a[x]] == 1) dis[x] = 1;
    else dis[x] = num + 1;
    if (p > 0 && vis[p] == 1)
        cycle[x] = 1, dis[x] = num;
    vis[x] = 2;
    return dis[x];
}

void solve() {
    cin >> n;
    f (i, 1, n)
        scanf("%lld", &a[i]);
    int k = 1;
    f (i, 1, n)
        if (!vis[i]) {
            p = -1;
            dfs(i);
        }
    f (i, 1, n)
        if (cycle[i])
            k = k * dis[i] / __gcd(k, dis[i]);
    int x = 0;
    f (i, 1, n)
        if (!cycle[i]) 
            x = max(x, dis[i]);
    if (x > k)
        k = ((x - 1) / k + 1) * k;
    printf("%lld\n", k);
}

标签:分析,结点,num,int,vis,解题,CF542C,lcm,dis
From: https://www.cnblogs.com/yh2021shx/p/17491925.html

相关文章

  • cpu 中控制单元执行的任务分析
    控制单元(ControlUnit)是计算机中的一个重要组件,它的主要任务是协调和控制计算机的各个部件,以执行程序中的指令序列。控制单元负责解码指令、生成控制信号,并将这些信号发送给其他组件,例如运算单元、寄存器组、存储器和输入/输出设备等。本文余下部分详细介绍控制单元的任务,并举例说......
  • calico 网络流量 过程 分析 apt-get install telnet
    1.caliconode容器在kubernetes中以DaemonSet的方式运行,容器的网络模式为hostNetwor,与host共享网络栈,拥有相同的Ip和hostname 2.查看某个pod:[root@bserver40~]#kubectlgetpods-owide-nkube-system|grep-itillertiller-deploy-5dfffddb8d-n4vp6 1/1    Runn......
  • calico 原理分析
    1.calico没有使用CNI的网桥模式,calico的CNI插件还需要在host机器上为每个容器的vethpair配置一条路由规则。cni插件是calico与kubernetes对接部分。2.BGP协议,就是大规模网络中,共享节点路由信息的协议。用一个例子来演示会更加清晰......
  • kubernetes 生命周期问题分析
    1.Failed --pod里至少一个容器以非0code退出,说明应用有问题,需要debug应用容器2.pending--说明API对象已经被创建和保存在etcd数据库里,但是创建过程出了问题,可能是imagepull出问题,也可能是调度出了问题3.Unknow--说明pod的状态不能持续地被Kubelet发送给kubeapi,这很可能是......
  • Turndown 源码分析:五、节点相关`root-node.js`和`node.js`
    importcollapseWhitespacefrom'./collapse-whitespace'importHTMLParserfrom'./html-parser'import{isBlock,isVoid}from'./utilities'//单独构造的根节点,防止输入字符串含有多个根元素exportdefaultfunctionRootNode(input,options){var......
  • POSTGRESQL 怎么通过explain 来分析SQL查询性能
    Explain命令是大多数数据库常用的一种展示SQL执行计划和cost的一种方式。在POSTGRESQL中EXPLAIN命令展示的信息比较详细,并且附带explain有不少的附加的命令来进行更多的展示。从命令来命令和功能来划分explainselecta.first_name,a.last_name,a.last_update,fa.film_idfrom......
  • BLE中的L2CAP层基本功能分析
    逻辑链路(LogicalLink)在明白L2CAP之前要先明白其中L2代表的logiclink是什么意义,在spec中的下述章节对这些概念进行了基本解释Vol1:Architecture&TerminologyOverviewPartA:Architecture3Datatransportarchitecture由于历史发展的原因,传统蓝牙将数据传输的方式方......
  • windows ,go powershell 测试并且性能分析
    benchamark并且性能分析gotest-runnone-bench.-benchmem-cpuprofilecpu.prof-memprofilemem.prof;Start-Job{gotoolpprof-http=:10000.\cpu.prof};Start-Job{gotoolpprof-http=:10001.\mem.prof}-bench表示执行哪些基准测试函数,后面可以加需要执行......
  • Turndown 源码分析:二、规则`commonmark-ruiles.js` REV1
    import{repeat}from'./utilities'varrules={}//段落rules.paragraph={filter:'p',replacement:function(content){//前后加两个换行return'\n\n'+content+'\n\n'}}//换行rules.lineBrea......
  • BUUCTF:[DDCTF2018]流量分析
    https://buuoj.cn/challenges#[DDCTF2018]%E6%B5%81%E9%87%8F%E5%88%86%E6%9E%90流量分析.pcap流量分析.txt流量分析200pt提示一:若感觉在中间某个容易出错的步骤,若有需要检验是否正确时,可以比较MD5:90c490781f9c320cd1ba671fcb112d1c提示二:注意补齐私钥格式-----BEGINRSAPR......