結果
| 問題 | 
                            No.1311 Reverse Permutation Index
                             | 
                    
| コンテスト | |
| ユーザー | 
                             ngtkana
                         | 
                    
| 提出日時 | 2020-06-15 01:29:41 | 
| 言語 | C++17  (gcc 13.3.0 + boost 1.87.0)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 2 ms / 1,500 ms | 
| コード長 | 1,335 bytes | 
| コンパイル時間 | 1,973 ms | 
| コンパイル使用メモリ | 201,260 KB | 
| 最終ジャッジ日時 | 2025-01-11 04:24:19 | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge5 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 2 | 
| other | AC * 6 | 
ソースコード
/*
 * validator
 */
#include <bits/stdc++.h>
std::pair<long long, char> read() {
    long long x = 0;
    char c;
    while (true) {
        c = std::getchar();
        if (!std::isdigit(c)) {
            return std::pair(x, c);
        }
        x = 10 * x + c - '0';
    }
}
int main() {
    std::cin.tie(nullptr);
    std::ios::sync_with_stdio(false);
    std::cout << std::setprecision(15) << std::fixed;
    char c;
    long long N; int n;
    std::tie(N, c) = read();
    std::tie(n, c) = read();
    assert(std::getchar()==EOF);
    assert(1ll <= n && n <= 20ll);
    std::vector<int> pinv(n), ckd(n);
    std::vector<long long> fact(n, 1);
    for (int i=1; i<n; i++) {
        fact.at(i) = fact.at(i-1) * i;
    }
    assert(0 <= N && N < fact.at(n-1) * n);
    for (int i=0; i<n; i++) {
        long long f = fact.at(n-1-i);
        int q = N / f;
        for (int j=0, k=0; j<n; j++) {
            if (!ckd.at(j) && k++==q) {
                pinv.at(j) = i;
                ckd.at(j) = true;
                break;
            }
        }
        N -= f * q;
    }
    ckd.assign(n, false);
    N = 0;
    for (int i=0; i<n; i++) {
        ckd.at(pinv.at(i)) = true;
        int q = 0;
        for (int j=0; j<pinv.at(i); j++) if (!ckd.at(j)) q++;
        N += fact.at(n-1-i) * q;
    }
    std::cout << N << '\n';
}
            
            
            
        
            
ngtkana