Codeforces Round #309 (Div. 2) D. Kyoya and Permutation

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_30358129/article/details/81303384

题目链接
思路:
长度为n的数列,稳定的排列数为fib[i] = fib[i-1]+fib[i-2];
然后从高位1向低位n遍历,判断每一位是否需要交换(剩余的数可以拼出k来,那么就不交换)

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1000+100;
const int mod = 1e9+7;
ll fib[55];
int s[55];
int main()
{
  //  freopen("a.txt","r",stdin);
    int i,n;
    ll k;
    fib[1] = fib[0] = 1;
    for(i = 2;i <= 50;i ++) fib[i]=fib[i-1]+fib[i-2];
    cin >>n>>k;
    for(i = 1;i <= n;i ++) s[i] = n-i+1;
    for(i = n;i > 1;i --){
        if(k<=fib[i-1]) continue;
        else {swap(s[i],s[i-1]);k-=fib[i-1];}
    }
    for(i = n;i >= 1;i --) {
        cout<<s[i];
        if(i!=1)cout<<' ' ;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_30358129/article/details/81303384