CodeForces ~ 987E ~ Petr and Permutations (思维,有趣)

题意:有n个数字,原始序列为1~n,给你该序列经过Petr或Um_nik操作后序列,问你是谁操作的?

Petr:随机交换两个数的位置,交换3n次。

Um_nik: 随机交换两个数的位置,交换7n+1次。


思路:可以发现3n和7n+1一定是一奇一偶的,那么我看考虑这个序列跟操作次数奇偶的性质,然后我就想不出来啦,哈哈哈。第二天看了别人的题解才会。


考虑两个数字的时候我们交换 2x 次跟没交换一样,交换2x+1次才有效。n个数字的时候,交换3n或7n+1次同样有很多没有用的操作。假设有效操作为cnt,那么剩下的都是无效操作,无效操作一定为2x次(即偶数次),因为奇数次操作一定会引起两个数位置的变化。如果(3n-cnt)为偶数就是Petr操作的,如果(7n+1-cnt)为偶数那么就是Um_nik操作的。

所以我们计算cnt就好了,其实cnt就是我们把这个序列每次交换两个数字,变为原序列,有效交换的次数。


#include
using namespace std;
const int MAXN = 1000005;
int n, a[MAXN], cnt;
int main()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
    for (int i = 1; i <= n; i++)
    {
        while (a[i] != i)
        {
            swap(a[i], a[a[i]]);
            cnt++;
        }
    }
    if ((3*n-cnt)&1) printf("Um_nik\n");
    if ((7*n+1-cnt)&1) printf("Petr\n");
    return 0;
}
/*
5
2 4 5 1 3
*/

你可能感兴趣的:(【思维/构造】)