Advertisement
ismaeil

Magic Sequence

Mar 1st, 2021
837
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.19 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef pair<int ,string> is;
  5. typedef vector< int > vi;
  6. typedef long long ll;
  7. #define S second
  8. #define F first
  9.  
  10. const int N = 1e6 + 6e1;
  11. int n ,a ,b ,c ,x ,y;
  12. vector< is > s ,tmpS;
  13.  
  14. inline int getDec(char B64)
  15. {
  16.     if( isdigit(B64) ) return (int)B64 - '0';
  17.     if( 'a' <= B64 && B64 <= 'z' ) return (int)B64 - 'a' + 10;
  18.     return (int)B64 - 'A' + 36;
  19. }
  20.  
  21. inline string get64(int dc)
  22. {
  23.     string r;
  24.     while( dc )
  25.     {
  26.         int m = dc % 64;
  27.        
  28.         if( m < 10 )
  29.             r += char(m + '0');
  30.         else if( m < 36 )
  31.             r += char(m - 10 + 'a');
  32.         else
  33.             r += char(m - 36 + 'A');
  34.        
  35.         dc /= 64;
  36.     }
  37.     return r;
  38. }
  39.  
  40. void makeS()
  41. {
  42.     ll num = a;
  43.     string B64 = get64(a);
  44.    
  45.     s.resize(n);
  46.     tmpS.resize(n);
  47.    
  48.     s[0] = is(num ,B64);
  49.     for(int i = 1 ; i < n ; i++)
  50.     {
  51.         num = s[i - 1].F;
  52.         num %= c;
  53.         num *= 1ll * b;
  54.         num %= c;
  55.         num += a;
  56.         num %= c;
  57.        
  58.         B64 = get64(num);
  59.         s[i] = is(num ,B64);
  60.     }
  61. }
  62.  
  63. bool countSort(int d)
  64. {
  65.     bool Res = false;
  66.  
  67.     vector< int > f(64 ,0);
  68.     for(int i = 0 ; i < n; i++)
  69.     {
  70.         int dec = 0;
  71.         if( d < (int)s[i].S.size() )
  72.         {
  73.             Res = true;
  74.             dec = getDec(s[i].S[d]);
  75.         }
  76.         f[dec] += 1;
  77.         tmpS[i] = s[i];
  78.     }
  79.  
  80.     if( Res )
  81.     {
  82.         for(int i = 1 ; i < 64; i++)
  83.         {
  84.             f[i] += f[i - 1];
  85.         }
  86.        
  87.         for(int i = n - 1 ; i >= 0 ; i--)
  88.         {
  89.             int dec = 0;
  90.             if( d < (int)tmpS[i].S.size() )
  91.                 dec = getDec(tmpS[i].S[d]);
  92.                
  93.             s[ f[dec] - 1 ] = tmpS[i];
  94.             f[dec] -= 1;
  95.         }
  96.     }
  97.  
  98.     return Res;
  99. }
  100.  
  101.  
  102. void RadixSort()
  103. {
  104.     int d = 0;
  105.     bool flag = true;
  106.     while( flag )
  107.     {
  108.         flag = countSort(d);
  109.         d += 1;
  110.     }
  111. }
  112.  
  113. ll getHash()
  114. {
  115.     ll res = 0;
  116.     for(is i : s)
  117.     {
  118.         res *= 1ll * x;
  119.         res %= y;
  120.         res += i.F;
  121.         res %= y;
  122.     }
  123.     return res;
  124. }
  125.  
  126. void Solve()
  127. {
  128.     scanf("%d%d%d%d%d%d" ,&n ,&a ,&b ,&c ,&x ,&y);
  129.    
  130.     makeS();
  131.     RadixSort();
  132.    
  133.     printf("%lld\n" ,getHash());
  134. }
  135.  
  136. int main()
  137. {
  138.     int Tc; scanf("%d" ,&Tc);
  139.     while( Tc-- ) Solve();
  140.     return 0;
  141. }
  142.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement