小Why的循环置换【牛客tracker 每日一题】

发布时间:2026/11/2 15:25:21
小Why的循环置换【牛客tracker  每日一题】

小Why的循环置换

时间限制:1 秒
空间限制:256M

网页链接

牛客tracker

牛客tracker & 每日一题,完成每日打卡,即可获得牛币。获得相应数量的牛币,能在【牛币兑换中心】,换取相应奖品!助力每日有题做,丰盈牛币日益多!


题目描述

小Why有一个长度为n nn的全排列a aa,定义p x p_xpx​表示元素x xx在a aa中的下标。

小Why先将上述n nn个元素映射为图G GG中的点,之后对于每个点x xx,都向p x p_xpx​连一条边。在完成这些操作后,图G GG中一共出现了m mm个环(包括自环)。

现在小Why告诉你可以对a aa执行以下操作任意多次:

小Why只打算告诉你n nn和m mm,他想考考你至少需要多少次操作才能使得a aa单调递增。


输入描述

第一行包含两个整数n , m ( 1 ≤ m ≤ n ≤ 10 9 ) n, m\ (1 \le m \le n \le 10^9)n,m(1≤m≤n≤109),表示图G GG中点的个数和环的个数。


输出描述

输出一个整数,表示最少操作次数。


示例

示例 1

输入:

2 1

输出:

1

数据范围

解题思路

本题是置换环分解 + 贪心的经典问题。给定一个长度为n nn的全排列a aa,定义p x p_xpx​为元素x xx在a aa中的下标。图G GG中每个点x xx向p x p_xpx​连一条有向边,已知图中共有m mm个环。每次可以交换a aa中任意两个元素的位置,求使a aa单调递增所需的最少交换次数。

1. 问题等价转化
2. 交换操作对环数的影响

交换a aa中两个位置上的元素,等价于在置换p pp中交换两个元素对应的像。对于置换的环分解:

为了使环数尽快增加到n nn,每次应选择同一个环中的两个元素进行交换,使环数增加1 11。

3. 最优次数
4. 算法实现
5. 复杂度分析

总结

将排列映射为置换图后,问题转化为通过交换元素将置换的环数从m mm增加到n nn。每次交换同一环中的两个元素可使环数增加1 11,因此最少操作次数为n − m n-mn−m。该方法巧妙利用置换环的性质,将复杂的交换过程抽象为环数的变化,实现极其简洁高效。

代码内容

#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'typedeflonglongll;typedefunsignedlonglongull;typedefvector<vector<ll>>vvt;typedefpair<ll,ll>pll;constll N=1e3+10;constll INF=1e18;constll M=1e6+10;constll mod=1e9+7;intmain(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);ll n,m;cin>>n>>m;cout<<n-m<<'\n';return0;}