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 just learned about cyclic representation of a permutation. A cycle is a sequence of numbers such that each element of this sequence is being mapped into the next element of this sequence (and the last element of the cycle is being mapped into the first element of the cycle). The cyclic representation is a representation of p as a collection of cycles forming p. For example, permutationp = [4, 1, 6, 2, 5, 3] has a cyclic representation that looks like (142)(36)(5) because 1 is replaced by 4, 4 is replaced by 2, 2 is replaced by 1, 3 and 6 are swapped, and 5 remains in place.

Permutation may have several cyclic representations, so Kyoya defines the standard cyclic representation of a permutation as follows. First, reorder the elements within each cycle so the largest element is first. Then, reorder all of the cycles so they are sorted by their first element. For our example above, the standard cyclic representation of [4, 1, 6, 2, 5, 3] is (421)(5)(63).

Now, Kyoya notices that if we drop the parenthesis in the standard cyclic representation, we get another permutation! For instance,[4, 1, 6, 2, 5, 3] will become [4, 2, 1, 5, 6, 3].

Kyoya notices that some permutations don't change after applying operation described above at all. He wrote all permutations of length nthat do not change in a list in lexicographic order. Unfortunately, his friend Tamaki Suoh lost this list. Kyoya wishes to reproduce the list and he needs your help. Given the integers n and k, print the permutation that was k-th on Kyoya's list.

Input

The first line will contain two integers nk (1 ≤ n ≤ 501 ≤ k ≤ min{1018, l} where l is the length of the Kyoya's list).

Output

Print n space-separated integers, representing the permutation that is the answer for the question.

Sample test(s)
input
4 3
output
1 3 2 4
input
10 1
output
1 2 3 4 5 6 7 8 9 10
Note

The standard cycle representation is (1)(32)(4), which after removing parenthesis gives us the original permutation. The first permutation on the list would be [1, 2, 3, 4], while the second permutation would be [1, 2, 4, 3].

题意:

给出n,k,代表有包含1~n的一个数组,通过对这些数进行一些排列,对于其中的一个序列,第i个位置会指向第a[i]个位置,如此便会形成一些环,将这些环合并成一组,按大到小排序,然后对于形成的多组而言,按照每一组开头数字的大小从小大大排序,形成一个新的序列

而对于这些序列而言,其中有一些序列按照题意的分类排序方法得到的新序列是与本身相等的,现在要求这些序列中的第k个是多少,k不会超过这种序列的总数


思路:

对于这种类型的序列,那么必然是交换相邻的两个,而且已经交换过了的是不能再交换了,而其中数量又与斐波那契数有关系


#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

#define lson 2*i
#define rson 2*i+1
#define LS l,mid,lson
#define RS mid+1,r,rson
#define UP(i,x,y) for(i=x;i<=y;i++)
#define DOWN(i,x,y) for(i=x;i>=y;i--)
#define MEM(a,x) memset(a,x,sizeof(a))
#define W(a) while(a)
#define gcd(a,b) __gcd(a,b)
#define LL long long
#define N 100005
#define INF 0x3f3f3f3f
#define EXP 1e-8
#define lowbit(x) (x&-x)
const int mod = 1e9+7;

LL n,k;
LL a[55];

int main()
{
    LL i,j;
    a[0] = a[1] = 1;
    for(i = 2;i<=50;i++)
    {
        a[i] = a[i-1]+a[i-2];
    }
    scanf("%I64d%I64d",&n,&k);
    LL c1 = 1,c2 = 2;
    while(n>0)
    {
        if(k>a[n-1])
        {
            printf("%I64d %I64d ",c2,c1);
            k-=a[n-1];
            n-=2;
            c2+=2;
            c1+=2;
        }
        else
        {
            printf("%I64d ",c1);
            n--;
            c1++;
            c2++;
        }
    }
    printf("\n");

    return 0;
}


你可能感兴趣的:(数学,几何)