分组
有n个元素的组需要交换n-1次
这样n-cyc就是最少的交换次数
petr与n奇偶一致,这样判断n与最少次数是否一致
Petr likes to come up with problems about randomly generated data. This time problem is about random permutation. He decided to generate a random permutation this way: he takes identity permutation of numbers from 1
times. Because it is more random, OK?!
You somehow get a test from one of these problems and now you want to know from which one.
In the first line of input there is one integer n
).
In the second line there are n
distinct integers between 1 and n — the permutation of size nfrom the test.
It is guaranteed that all tests except for sample are generated this way: First we choose n
— the size of the permutation. Then we randomly choose a method to generate a permutation — the one of Petr or the one of Alex. Then we generate a permutation using chosen method.
If the test is generated via Petr's method print "Petr" (without quotes). If the test is generated via Alex's method print "Um_nik" (without quotes).
5 2 4 5 1 3
Petr
Please note that the sample is not a valid test (because of limitations for n
#include <bits/stdc++.h> using namespace std; #define rep(i,a,n) for (int i=a;i<n;i++) #define per(i,a,n) for (int i=n-1;i>=a;i--) #define pb push_back #define mp make_pair #define all(x) (x).begin(),(x).end() #define fi first #define se second #define SZ(x) ((int)(x).size()) typedef vector<int> VI; typedef long long ll; typedef pair<int,int> PII; const ll mod=1000000007; ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;} ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;} // head const int N=101000; int n,p[N],vis[N],cyc; int main() { scanf("%d",&n); rep(i,0,n) scanf("%d",p+i),--p[i]; rep(i,0,n) if (!vis[i]) { int y=i; cyc++; while (!vis[y]) { vis[y]=1; y=p[y]; } } cyc=n-cyc; if (cyc%2==n%2) puts("Petr"); else puts("Um_nik"); }