首页 > 其他分享 >Codeforces - 542C - Idempotent functions(思维 + 数学、*2000)

Codeforces - 542C - Idempotent functions(思维 + 数学、*2000)

时间:2022-12-25 23:44:21浏览次数:68  
标签:functions int big Idempotent Codeforces 图论 542C

542C - Idempotent functions(⇔源地址



目录






tag

*2000 + 构造 + 图论 + 数学 。没看太大出来这道题跟构造的关联,主要可能更靠思维,与图论的关联也比较弱(具有图论的性质,但是跟图论的算法无关)。题目非常不友好,看不懂……

个人评:*2000 + 思维 + 数学


题意

定义 a[x]Idempotent 的,当 a[a[x]] == a[x] 时。

定义 \(f^{(1)}(x)\) 是 a[x] ,$f^{(2)}(x) = f{(1)}\big( f{(1)}(x)\big)\ $ 是 a[a[x]] ,$f^{(3)}(x) = f^{(1)}\big(\ f^{(2)}(x) \big)\ $ 是 a[a[a[x]]] ,以此类推。

找到最小的 \(k\) ,使得对于 \(\forall x \in [1,n]\) ,\(f^{(k)}(x)\) 都是 Idempotent 的。


思路

题干较为难度,其中包含了一层隐藏的含义,即,只要 \(f^{(k)}(x)\) 能变化出来一个 \(f^{(t)}(x),(t \le k)\) 是 Idempotent 的,那么 \(f^{(k)}(x)\) 就是 Idempotent 的。

以下思路参考自 这一篇博客

展开推导之后发现,随着 \(k\) 增大,\(f^{(k)}(x)\) 的值必定会进入一个循环节,而循环节的长度最大不超过 a 数组的大小。这其实跟一张有向图一样,题目中有图论标签的原因或许正在于此。

有了隐含意思的解释,我们很容易的发现,我们找到每一个 \(f^{(k)}(x)\) 的循环节,答案即为这些循环节的最大公倍数。而本题另一个难点随之而来,我们发现,在进入循环节之前可能会有一段多余的变化(如下例的 \(x = 9\) 的情况),所以还需保证 \(k\) 大于这段多余变化的长度。

附样例:

9
5 6 7 4 2 5 1 3 8

其变换方式依次:

5 6 7 4 2 5 1 3 8
2 5 1 4 6 2 5 7 3
6 2 5 4 5 6 2 1 7

5 6 2 4 2 5 6 5 1
2 5 6 4 6 2 5 2 5
6 2 5 4 5 6 2 6 2

5 6 2 4 2 5 6 5 6
2 5 6 4 6 2 5 2 5
6 2 5 4 5 6 2 6 2

5 6 2 4 2 5 6 5 6
2 5 6 4 6 2 5 2 5
6 2 5 4 5 6 2 6 2

AC代码

点击查看代码
int a[N], vis[N];
signed main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	
	int n; cin >> n;
	for (int i = 1; i <= n; ++ i) cin >> a[i];
	
	int ans = 1, start = 0;
	for (int i = 1; i <= n; ++ i) {
		int x = a[i], len = 0;
		fill(vis + 1, vis + 1 + n, 0);
		while (!vis[x]) {
			vis[x] = ++ len; // 记录第一次查找到这个位置的时间戳
			x = a[x];
		}
		// 循环节开始时间戳:vis[x]
		// 循环节长度:len - vis[x] + 1
		start = max(start, vis[x] - 1);
		ans = lcm(ans, len - vis[x] + 1);
	}
	
	for (int i = 1; ; ++ i) {
		if (ans * i > start) return cout << ans * i, 0;
	}
	
	return 0;
}

错误次数:1

处理多余变换时没有到位,没有完全处理掉。






文 / WIDA
2022.12.25 成文
首发于WIDA个人博客,仅供学习讨论

标签:functions,int,big,Idempotent,Codeforces,图论,542C
From: https://www.cnblogs.com/WIDA/p/17004862.html

相关文章

  • Codeforces 983 D Arkady and Rectangles 题解
    题目链接挺有意思的数据结构题,题面看着像个板子,其实还是有不少学问的。平面上一堆矩形的题目常见套路就是对\(x\)轴扫描线,\(y\)轴线段树维护,这题也不例外。我们先对坐标......
  • Codeforces Round #769 (Div. 2) B,C
    CodeforcesRound#769(Div.2)B,CBB这道题我在vp的时候一直没有想出来,一直不知道到底怎么写,只是想到和幂有关,wa了一发,后来看了大佬的题解,真是觉得自己太菜了,自愧不如......
  • Codeforces Round #814 (Div. 2)
    A核心思路:这题没什么好说的直接面向样例编程。#include<iostream>#include<cstring>#include<string>#include<vector>#include<math.h>#include<cmath>#inc......
  • Codeforces Round #586 (Div. 1 + Div. 2) D
    D.AlexandJulian题链很容易发现我们要是两个数互相不构成奇环的话=(a+b)/gcd(a,b)为偶数我们发现如果ab为奇数的时候一定可以并且奇偶一定不同组但是发现24这种又......
  • Educational Codeforces Round 122 (Rated for Div. 2),C,D
    EducationalCodeforcesRound122(RatedforDiv.2),C,DCC这道题就是普通的暴力,但是我在做的过程中第10组数据出现了数据溢出的错误我的错误代码,我在vp的时候没觉得......
  • Codeforces Round #589 (Div. 2) D
    D.CompleteTripartite题链与其他题解不同我首先发现的是没有相连的一定是同一组那么我们直接对于整个数组遍历一遍将与1同组的搞出来要是下一个位置已经有组了我......
  • Codeforces Round #770 (Div. 2)B,C
    CodeforcesRound#770(Div.2)B,C还是惨绝人寰的只做了一个题,ε=(´ο`*)))唉BB这一道题大意是是首先有一个d,然后有n个操作,从1到n,每一次我们都需要选择让d=d+a[i]还是d......
  • Codeforces 1097 G Vladislav and a Great Legend 题解 (DP)
    题目链接思路首先看到这种求\(x^k\)形式的,直接无脑转下降幂:\(x^k=\sum_{i=1}^kS2(k,i)\cdotx^{\underline{i}}\),其中\(S2\)表示第二类斯特林数,\(x^{\underlinei}\)表......
  • Codeforces 1097 G Vladislav and a Great Legend 题解 (DP)
    题目链接思路首先看到这种求\(x^k\)形式的,直接无脑转下降幂:\(x^k=\sum_{i=1}^kS2(k,i)\cdotx^{\underline{i}}\),其中\(S2\)表示第二类斯特林数,\(x^{\underlinei}\)表......
  • Codeforces 1097 G Vladislav and a Great Legend 题解 (DP)
    题目链接思路首先看到这种求\(x^k\)形式的,直接无脑转下降幂:\(x^k=\sum_{i=1}^kS2(k,i)\cdotx^{\underline{i}}\),其中\(S2\)表示第二类斯特林数,\(x^{\underlinei}\)表......