zoukankan      html  css  js  c++  java
  • 【基础】字典序第k大的排列

    ll fac[18];
    
        int n, k, c;
        int last[18];
    
        void show() {
            printf("k=%d
    ", k);
            for(int i = 1; i <= c; ++i)
                printf("%d%c", last[i], " 
    "[i == c]);
        }
    
        void Solve() {
            ll pro = 1;
            bool ok = 0;
            fac[0] = 1;
            for(int i = 1; i <= 15; ++i)
                fac[i] = fac[i - 1] * i;
            for(int i = 1; i <= n; ++i) {
                pro *= i;
                if(pro >= k) {
                    ok = 1;
                    break;
                }
            }
            if(!ok) {
                puts("-1");
                return;
            }
    //        for(int i = 0; i <= 15; ++i)
    //            printf("fac[%d]=%lld
    ", i, fac[i]);
            c = min(n, 15);
            for(int i = 1; i <= c; ++i)
                last[i] = n + 1 - i;
            sort(last + 1, last + 1 + c);
            --k;
            //show();
            for(int i = 1; k > 0 && i <= c; ++i) {
                //printf("len=%d fac=%lld
    ", c - i, fac[c - i]);
                if(k < fac[c - i])
                    continue;
                assert(k >= fac[c - i]);
                int kk = k / fac[c - i];
                swap(last[i], last[i + kk]);
                k %= fac[c - i];
                sort(last + i + 1, last + 1 + c);
                //show();
            }
            show();
            return;
        }
    
  • 相关阅读:
    vue 響應接口
    vue ajax
    vue混入
    vue動畫和過渡
    vue路由
    vue自定義指令
    python项目_使用极验验证码
    python项目_使用异步功能,celery
    python项目_集成短信发送功能
    python项目_redis使用
  • 原文地址:https://www.cnblogs.com/purinliang/p/14206225.html
Copyright © 2011-2022 走看看