[Codeforces] 986B

Petr and Permutations

卡好久…終於AC了><

題敘

有一個$1$ ~ $n$的排列($10 ^ 3 \leq n \leq 10 ^ 6$),
問你它是隨機交換$3n$還是$7n + 1$次的陣列。

想法

排列

排列最重要的性質有一個:
就是把index跟value組成圖會有好多個環(或只有一個),
每次操作會增加一個環或減少一個環,而初始有$n$個(自環)
所以環的數量的奇偶就可以解決這個問題,
$n$個環操作$3n$次一定是偶數,
操作$7n + 1$次一定是奇數。

逆序數對

燒雞,我一直吃WA
qwq

AC Code

/*  | |       _    _  | |        _____       | |
//  | |   _  | |  | | | | _____ /  ___|__  __| |___  _____
//  | |  |_|[   ][   ]| |/  _  \| |    | | | |  _  \/  _  \  
//  | L__| | | |_ | |_| || ____|| |___ | |_| | |_| || ____|
//  L____|_| |___||___|_|\_____|\_____|\_____/\____/\_____|
//  Segment Tree is hard.
*/
#pragma GCC optimize("O3,unroll-loops")
#include <bits/stdc++.h>
#pragma pack(0)
#define int long long
#define ll long long
#define pii pair<int, int>
#define pll pair<ll, ll>
#define F first
#define S second
#define pb(x) emplace_back(x)
#define MOD 1000000007
#define MOD2 998244353
#define _INFINITY 9223372036854775807
#define fast ios::sync_with_stdio(0), cin.tie(0)
using namespace std;

int n, m, arr[1000005], bit[1000005];
signed main()
{

    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> arr[i];
    for (int i = 1; i <= n; i++)
    {
        if (arr[i] == 0)
            continue;
        m ^= 1;
        int k = i;
        while(k)
        {
            int t = k;
            k = arr[k];
            arr[t] = 0;
        }
    }
    if (m)
        cout << "Um_nik";
    else
        cout << "Petr";
}