Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <iostream>
- #include <map>
- #include <vector>
- #include <utility>
- #include <cmath>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- typedef long long int ll;
- typedef pair<ll, ll> ipair;
- #define mod 1000000007
- #define pb push_back
- #define mp make_pair
- #define ff first
- #define ss second
- #define rep(i,n) for(i=0;i<n;i++)
- #define fu(i,a,n) for(i=a;i<=n;i++)
- #define fd(i,n,a) for(i=n;i>=a;i--)
- #define all(a) a.begin(),a.end()
- #define gi(n) scanf("%d",&n)
- #define gl(n) scanf("%lld",&n)
- #define pi(n) printf("%d",n)
- #define pl(n) printf("%lld",n);
- #define pp printf(" ")
- #define pn printf("\n")
- #define LN 31
- #define MAX 100005
- #define INF 1000000000000000005LL
- ll num[26];
- int mark[26];
- char str[26];
- int mark2[26];
- ll fact[26];
- int main() {
- scanf("%s", str);
- num[0] = fact[0] = fact[1] = 1;
- ll l = strlen(str);
- ll i, j;
- mark[str[0] - 'a'] = 1;
- fu(i, 1, l - 1) {
- num[i] = i * num[i - 1] + 1;
- mark[str[i] - 'a'] = 1;
- }
- ll tot = 1;
- fu(i, 2, l) {
- fact[i] = i * fact[i - 1];
- tot = (tot + 1) * i;
- }
- ll q;
- gl(q);
- while(q--) {
- ll k;
- gl(k);
- int id = 0;
- rep(i, 26) {
- mark2[i] = mark[i];
- }
- if(k > tot) {
- pl(tot);
- pn;
- continue;
- }
- ll cnt = l;
- rep(i, 26) {
- if(mark2[i]) {
- if(num[cnt - 1] >= k) {
- str[id] = (char)(i + 'a');
- id++;
- k--;
- mark2[i] = 0;
- cnt--;
- break;
- }
- else {
- k-=num[cnt - 1];
- }
- }
- }
- if(k) {
- ll ln = 0;
- fu(i, 1, cnt) {
- ll val = fact[cnt]/fact[cnt - i];
- if(k <= val) {
- ln = i;
- break;
- }
- else {
- k-=val;
- }
- }
- fd(i, ln, 1) {
- ll val = fact[cnt - 1]/fact[cnt - i];
- rep(j, 26) {
- if(mark2[j]) {
- if(k <= val) {
- str[id] = (char)(j + 'a');
- id++;
- mark2[j] = 0;
- cnt--;
- break;
- }
- else {
- k-=val;
- }
- }
- }
- }
- }
- str[id] = '\0';
- printf("%s\n", str);
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment