412. Sislovesme May 2026
import sys
(A classic “mutual‑love” counting problem – often seen on SPOJ, LightOJ, and other online judges) 1️⃣ Problem statement You are given a group of N people, numbered from 1 to N . Each person loves exactly one other person (possibly himself). The love‑relationships are described by an array
Memory – The array love[1…N] is stored: . 412. Sislovesme
love[i] = j and love[j] = i . Your task is to count how many mutual‑love pairs exist in the given group.
If i, j is not mutual, at least one of the equalities love[i]=j or love[j]=i is false. Consider the iteration where i is the smaller index of the two. If love[i] ≠ j → the algorithm’s first condition ( j = love[i] ) fails. If love[i] = j but love[j] ≠ i → the second condition fails. Thus the counter is never increased for this unordered pair. ∎ Theorem After processing a test case, mutualPairs equals the total number of mutual‑love pairs in the group. love[i] = j and love[j] = i
When the loop later reaches i = b , the first condition fails ( b < a is false), so the pair is counted again. ∎ Lemma 3 If a pair i, j is not a mutual‑love pair, the algorithm never increments mutualPairs for it.
Both limits satisfy the given constraints ( ∑ N ≤ 10⁶ ). Below are clean, production‑ready solutions in C++ (17) and Python 3 . Both follow the algorithm described above and use fast I/O to handle the maximum input size. C++ (GNU‑C++17) #include <bits/stdc++.h> using namespace std; Consider the iteration where i is the smaller
long long ans = 0; // up to N/2 fits in int, but long long is safe for (int i = 1; i <= N; ++i) int j = love[i]; if (i < j && love[j] == i) ++ans; // count each 2‑cycle once cout << ans << '\n'; return 0;