Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define FastIO cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
- #define LSOne(a) ( (a) & -(a) )
- #define SQ(a) (a)*(a)
- #define INF 4e18
- #define EPS 1e-9
- #define OO 1e9
- #define PB push_back
- #define MP make_pair
- #define S second
- #define F first
- typedef long double ld;
- typedef long long ll;
- typedef pair<int , int> ii;
- typedef pair<int , ii> iii;
- typedef pair<ll , ll> pll;
- typedef vector< int > vi;
- typedef vector< ll > vl;
- typedef vector< ii > vii;
- typedef vector< pll > vll;
- /// ======================= ///
- string Read(bool spaces)
- {
- const int MaxN = 2e6 + 1;
- static char Buff[MaxN];
- fflush(stdin);
- fflush(stdout);
- spaces ? scanf("%[^\n]s" ,Buff)
- : scanf("%s" ,Buff);
- fflush(stdin);
- fflush(stdout);
- return Buff;
- }
- /// ======================= ///
- typedef tuple<int ,string ,int> is;
- const ll MOD = 1e9 + 7;
- const int N = 1e6 + 6e1;
- int n ,a ,b ,c ,x ,y;
- vector< is > s ,tmpS;
- vector< vi > cnt;
- inline int getDec(char _64)
- {
- if( isdigit(_64) ) return (int)_64 - '0';
- if( 'a' <= _64 && _64 <= 'z' ) return (int)_64 - 'a' + 10;
- return (int)_64 - 'A' + 36;
- }
- inline string get64(int dc)
- {
- string r;
- while( dc )
- {
- int m = dc % 64;
- if( m < 10 )
- r += char(m + '0');
- else if( m < 36 )
- r += char(m - 10 + 'a');
- else
- r += char(m - 36 + 'A');
- dc /= 64;
- }
- return r;
- }
- void makeS()
- {
- ll num = a;
- string B = get64(a);
- int sz = B.size();
- s.resize(n);
- tmpS.resize(n);
- s[0] = is(num ,B ,sz);
- for(int i = 1 ; i < n ; i++)
- {
- num = get<0>(s[i - 1]);
- num %= c;
- num *= 1ll * b;
- num %= c;
- num += a;
- num %= c;
- B = get64(num);
- sz = B.size();
- s[i] = is(num ,B ,sz);
- }
- }
- void RadixSort()
- {
- int dc ,i ,j ,k ,v ,f = 1;
- for(int d = 0 ; f ; d += 1)
- {
- f = 0;
- cnt.assign(64 ,vi());
- for(i = 0 ; i < n ; i++)
- {
- dc = 0;
- if( d < get<2>(s[i]) )
- {
- f = 1;
- dc = getDec( get<1>(s[i])[d] );
- }
- cnt[dc].PB(i);
- tmpS[i] = s[i];
- }
- if( !f ) break;
- k = 0;
- for(v = 0 ; v < 64 ; v++)
- for(j = 0 ; j < (int)cnt[v].size() ; j++)
- s[k++] = tmpS[cnt[v][j]];
- }
- }
- ll getHash()
- {
- ll v = 0;
- for(is i : s)
- {
- v *= 1ll * x;
- v %= y;
- v += get<0>(i);
- v %= y;
- }
- return v;
- }
- void Solve()
- {
- scanf("%d%d%d%d%d%d" ,&n ,&a ,&b ,&c ,&x ,&y);
- makeS();
- RadixSort();
- printf("%lld\n" ,getHash());
- }
- int main()
- {
- int Tc; scanf("%d" ,&Tc);
- while( Tc-- ) Solve();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement