Advertisement
_rashed

SRM428-D2-1000 TheDictionary

Oct 18th, 2021
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.15 KB | None | 0 0
  1. #define ll long long
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. const int OO = 1e9;
  6. const double EPS = 1e-9;
  7.  
  8.  
  9. class TheDictionary {
  10. public:
  11.     void decompose(ll x, map<ll,ll> &mp, bool p) {
  12.         for(ll f = 2; f <= x; f++) {
  13.             int o = f;
  14.             for(ll i = 2; i*i <= o; i++) {
  15.                 while(!(o%i)) {
  16.                     if(p)
  17.                         mp[i]++;
  18.                     else
  19.                         mp[i]--;
  20.                     o /= i;
  21.                 }
  22.             }
  23.             if(o != 1) {
  24.                 if(p)
  25.                     mp[o]++;
  26.                 else
  27.                     mp[o]--;
  28.             }
  29.         }
  30.     }
  31.  
  32.     ll fast_exp(ll base, ll p) {
  33.         if(!p)
  34.             return 1;
  35.         if(p&1)
  36.             return base * fast_exp(base,p-1);
  37.         ll ret = fast_exp(base,p/2);
  38.         return ret * ret;
  39.     }
  40.  
  41.     ll comb(ll n, ll m) {
  42.         ll total = n+m;
  43.         map<ll,ll> mp;
  44.         decompose(total,mp,1);
  45.         decompose(n,mp,0);
  46.         decompose(m,mp,0);
  47.         ll ret = 1;
  48.         for(pair<ll,ll> p : mp) {
  49.             //cout << "p.first is " << p.first << " p.second is " << p.second << "\n";
  50.             ret *= fast_exp(p.first,p.second);
  51.         }
  52.         return ret;
  53.     }
  54.  
  55.     string find(int n, int m, int k) {
  56.         if(k == 0) {
  57.             return string(n,'a') + string(m,'z');
  58.         }
  59.         if(m == 0) {
  60.             return string(n,'a');
  61.         }
  62.         if(n == 0) {
  63.             return string(m,'z');
  64.         }
  65.         ll _prev = 1;
  66.         for(int i = 0; i <= n; i++) {
  67.             ll curr = comb(i,m-1)+_prev-1;
  68.             //cout << "prev is " << _prev << " curr is " << curr << "\n";
  69.             if(k >= _prev && k <= curr) {
  70.                 return string(n-i,'a') + 'z' + find(i,m-1,k-_prev+1);
  71.             }
  72.             _prev = curr+1;
  73.         }
  74.         return "";
  75.     }
  76. };
  77.  
  78. int main()
  79. {
  80.     /*ios_base::sync_with_stdio(false);
  81.     cin.tie(NULL);
  82.     cout.tie(NULL);*/
  83.     TheDictionary d;
  84.     ll limit = d.comb(3,3);
  85.     for(int i = 1; i <= limit; i++) {
  86.         cout << d.find(3,3,i) << "\n";
  87.     }
  88.     return 0;
  89. }
  90.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement