Codeforces 553B Kyoya and Permutation

problem

题意

  • 本题题意不太容易看懂。给定一个序列,我们可以把这个序列变成一些循环置换的和。然而这种置换的方法是不止一种的。我们定义一种standard cyclic representation,即每个循环置换中最大的数都在第一个。把得到的循环置换的括号去掉,我们可以得到一个新的序列。定义一个序列,使得它变成置换后再去掉括号得到的新序列和原序列相同,那么称这样的序列是稳定的。给定一个n(序列长度)和k,要求求出所有稳定序列按字典序排序后的第k大序列。

思路

  • 首先我们可以证明,稳定序列是具有一定性质的。第一,1,2,3...n这种序列是稳定序列。第二,所有的稳定序列都是由1,2,3...n这种序列经过相邻的数交换得来的,并且每个数只能被交换一次。
  • 这是因为,稳定的置换中,每个循环置换的长度不可能超过2。因为长度为3的循环置换就已经不可能找出了,故长度大于4的也不可能找出。
  • 有了这个性质,可以推知,对于长度为n的序列,共有fib[n]种稳定序列。
  • 我们对每一位进行判断。如果当前的k<fib[n-i]说明当前位无需发生改变,否则就交换当前位和下一位,并且在k中减去不交换的序列数,即fib[n-i]。最后输出答案即可。

AC代码

/*written by znl1087*/
#include <bits/stdc++.h>
#define LL long long
using namespace std;
LL fib[51],k;
int n;
int ans[51];
int main()
{
    fib[0] = fib[1] = 1LL;
    for(int i=2;i<=51;i++)fib[i] = fib[i-1]+fib[i-2];
    cin>>n>>k;
    k--;
    for(int i=1;i<=n;i++)ans[i] = i;
    for(int i=1;i<=n;){
        if(k < fib[n-i])
            i++;
        else{
            swap(ans[i],ans[i+1]);
            k-=fib[n-i];
            i+=2;
        }
    }
    for(int i=1;i<=n;i++)cout<<ans[i]<<(i == n?‘\n‘:‘ ‘);
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 17:41:09

Codeforces 553B Kyoya and Permutation的相关文章

Codeforces A. Kyoya and Colored Balls(分步组合)

题目描述: Kyoya and Colored Balls time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Kyoya Ootori has a bag with n colored balls that are colored with k different colors. The colors are labeled f

Codeforces554D:Kyoya and Permutation

Let's define the permutation of length n as an array p?=?[p1,?p2,?...,?pn] consisting of n distinct integers from range from 1 to n. We say that this permutation maps value 1 into the value p1, value 2 into the value p2 and so on. Kyota Ootori has ju

codeforces 553A . Kyoya and Colored Balls 组合数学

Kyoya Ootori has a bag with n colored balls that are colored with k different colors. The colors are labeled from 1 to k. Balls of the same color are indistinguishable. He draws balls from the bag one by one until the bag is empty. He noticed that he

【搜索】【并查集】Codeforces 691D Swaps in Permutation

题目链接: http://codeforces.com/problemset/problem/691/D 题目大意: 给一个1到N的排列,M个操作(1<=N,M<=106),每个操作可以交换X Y位置上的数字,求可以得到的最大字典序的数列. 题目思路: [搜索][并查集] 这题可以用搜索或者并查集写,都能过. 把位置分成若干块,每一块里面的位置都是可以被这一块里另一个位置经过若干次调换的(类似强连通,位置可达). 然后把每一块位置里的 位置按从小到大排序,位置上的值按从大到小排序,依次填入位置

Codeforces 691D. Swaps in Permutation

题目链接:http://codeforces.com/problemset/problem/691/D 题意: 给你一个含有 N 个不重复数的序列, 以及 M 对形如 (ai, bj) 的数, (ai ,bj) 代表着可以把第 ai 个数可以和第 bj 个数进行交换, 问如何交换才能使得变换后的字典序最大,每个变化可选可不选,也可选多次. 思路: 可以想到, 如果 a 可以和 b 换, b 可以和 c 换, 那么 a 就可以间接的和 c 换, 依次类推, 如果某些位置直接可以变换, 那么与这些位

codeforces 500B.New Year Permutation 解题报告

题目链接:http://codeforces.com/problemset/problem/500/B 题目意思:给出一个含有 n 个数的排列:p1, p2, ..., pn-1, pn.紧接着是一个 n * n 的矩阵A,当且仅当 Aij = 1 时,pi 与 pj 可以交换数值.现在问如何交换数值,使得最后得到的排列字典序最小. 比赛的时候不会做,看了Tutorial 1 的解法,觉得别人做得太巧妙了,出题者也出得很好 ^_^ 可以看这个:http://codeforces.com/blog

Codeforces 553A. Kyoya and Colored Balls

Kyoya Ootori has a bag with n colored balls that are colored with k different colors. The colors are labeled from 1 to k. Balls of the same color are indistinguishable. He draws balls from the bag one by one until the bag is empty. He noticed that he

[Codeforces 864D]Make a Permutation!

Description Ivan has an array consisting of n elements. Each of the elements is an integer from 1 to n. Recently Ivan learned about permutations and their lexicographical order. Now he wants to change (replace) minimum number of elements in his array

●codeforces 553E Kyoya and Train

题链: http://codeforces.com/problemset/problem/623/E 题解: FFT,DP 题意: 一个有向图,给出每条边的起点u,终点v,费用c,以及花费每种时间的概率P[e][j](表示走第e条边花费时间为j的概率) 现在需要从1号点走到n号点,如果不能在T个单位时间内到达,则达到后还要另外支付X的费用. 求出所需支付的最小期望费用. 先是一个暴力的DP方案: (考虑到每条边的耗时至少为1,可以把状态设为类似分层图的形式) 定义$F[i][t]$为$t$时刻在