Guest User

Untitled

a guest
Nov 6th, 2018
54
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <map>
  4. #include <vector>
  5. #include <utility>
  6. #include <cmath>
  7. #include <cstring>
  8. #include <algorithm>
  9. using namespace std;
  10.  
  11. typedef long long int ll;
  12. typedef pair<ll, ll> ipair;
  13. #define mod 1000000007
  14. #define pb push_back
  15. #define mp make_pair
  16. #define ff first
  17. #define ss second
  18. #define rep(i,n) for(i=0;i<n;i++)
  19. #define fu(i,a,n) for(i=a;i<=n;i++)
  20. #define fd(i,n,a) for(i=n;i>=a;i--)
  21. #define all(a)  a.begin(),a.end()
  22. #define gi(n) scanf("%d",&n)
  23. #define gl(n) scanf("%lld",&n)
  24. #define pi(n) printf("%d",n)
  25. #define pl(n) printf("%lld",n);
  26. #define pp printf(" ")
  27. #define pn printf("\n")
  28. #define LN 31
  29. #define MAX 100005
  30. #define INF 1000000000000000005LL
  31.  
  32. ll num[26];
  33. int mark[26];
  34. char str[26];
  35. int mark2[26];
  36. ll fact[26];
  37. int main() {
  38.     scanf("%s", str);
  39.     num[0] = fact[0] = fact[1] = 1;
  40.     ll l = strlen(str);
  41.     ll i, j;
  42.     mark[str[0] - 'a'] = 1;
  43.     fu(i, 1, l - 1) {
  44.         num[i] = i * num[i - 1] + 1;
  45.         mark[str[i] - 'a'] = 1;
  46.     }
  47.     ll tot = 1;
  48.     fu(i, 2, l) {
  49.         fact[i] = i * fact[i - 1];
  50.         tot = (tot + 1) * i;
  51.     }
  52.     ll q;
  53.     gl(q);
  54.     while(q--) {
  55.         ll k;
  56.         gl(k);
  57.         int id = 0;
  58.         rep(i, 26) {
  59.             mark2[i] = mark[i];
  60.         }
  61.         if(k > tot) {
  62.             pl(tot);
  63.             pn;
  64.             continue;
  65.         }
  66.         ll cnt = l;
  67.         rep(i, 26) {
  68.             if(mark2[i]) {
  69.                 if(num[cnt - 1] >= k) {
  70.                     str[id] = (char)(i + 'a');
  71.                     id++;
  72.                     k--;
  73.                     mark2[i] = 0;
  74.                     cnt--;
  75.                     break;
  76.                 }
  77.                 else {
  78.                     k-=num[cnt - 1];
  79.                 }
  80.             }
  81.         }
  82.         if(k) {
  83.             ll ln = 0;
  84.             fu(i, 1, cnt) {
  85.                 ll val = fact[cnt]/fact[cnt - i];
  86.                 if(k <= val) {
  87.                     ln = i;
  88.                     break;
  89.                 }
  90.                 else {
  91.                     k-=val;
  92.                 }
  93.             }
  94.             fd(i, ln, 1) {
  95.                 ll val = fact[cnt - 1]/fact[cnt - i];
  96.                 rep(j, 26) {
  97.                     if(mark2[j]) {
  98.                         if(k <= val) {
  99.                             str[id] = (char)(j + 'a');
  100.                             id++;
  101.                             mark2[j] = 0;
  102.                             cnt--;
  103.                             break;
  104.                         }
  105.                         else {
  106.                             k-=val;
  107.                         }
  108.                     }
  109.                 }
  110.             }
  111.         }
  112.         str[id] = '\0';
  113.         printf("%s\n", str);
  114.     }
  115.     return 0;
  116. }
RAW Paste Data