#include <bits/stdc++.h>
#define fi first
#define endl '\n'
#define se second
#define int long long
#define getName(x) #x
#define vi std::vector<int>
#define isz(v) (int) v.size()
#define pii std::pair<int, int>
#define all(v) v.begin(), v.end()
#define loop cerr << "here" << endl;
#define breakLoop if(TIME > 1) break;
#define TIME 1.0 * clock() / CLOCKS_PER_SEC
using namespace std;
typedef long long ll;
template <typename T> void maximize(T &a, T b){if(a < b) a = b;}
template <typename T> void minimize(T &a, T b){if(a > b) a = b;}
ll add(ll x, ll y, ll p){return (x % p + y % p + p) % p;}
ll mul(ll x, ll y, ll p){return (x % p * y % p + p) % p;}
struct info{
int curVal, k, p, v;
}q[207];
int pre[60002][202], t, v = 2, maxi[2000007];
vi compress;
int getID(int val){
return lower_bound(all(compress), val) - compress.begin() + 1;
}
int get(int val, int p){
//digit.clear();
string s;
int pow10 = 1, res = 0, idxP = getID(p);
for(int i = 0; i <= log10(val); i++)
s += ((val / pow10) % 10) + '0', pow10 *= 10;
sort(all(s));
pow10 = 1;
for(int i = 0; i < isz(s); i++){
int r = s[i] - '0';
res = add(res, mul(r, add(pre[i * v + v - 1][idxP], (i * v == 0) ? 0 : -pre[i * v - 1][idxP], p), p), p);
pow10 *= 10;
}
return res;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
#define task "t"
if (fopen(task".inp", "r")){
freopen(task".inp", "r", stdin);
freopen(task".out", "w", stdout);
}
cin >> t;
for(int i = 1; i <= t; i++){
int curVal, k, p;
cin >> curVal >> k >> v >> p;
q[i] = {curVal, k, p, v};
maximize(maxi[p], v);
compress.push_back(p);
} sort(all(compress)); compress.erase(unique(all(compress)), compress.end());
for(int tc = 1; tc <= t; tc++){
//cin >> curVal >> k >> p;
//v = 2;
int curVal = q[tc].curVal, k = q[tc].k, p = q[tc].p;
v = q[tc].v;
if(!pre[0][getID(p)]){
int idxP = getID(p);
pre[0][idxP] = 1;
int curPow = 1;
for(int i = 1; i <= 6 * maxi[p]; i++)
curPow = mul(curPow, 10, p), pre[i][idxP] = add(curPow, pre[i - 1][idxP], p);
}
unordered_map <int, int> mp;
int timer = 0;
while(!mp.count(curVal) and k){
mp[curVal] = timer++;
k--;
curVal = get(curVal, p);
}
if(!k){
cout << curVal << ' ';
continue;
}
int cycleLen = timer - mp[curVal];
k %= cycleLen;
while(k--)
curVal = get(curVal, p);
cout << curVal << ' ';
}
}
/*
idea: xử dụng vòng lặp
cm đpt: xấp xỉ 5008
gọi xi là số lượng số chữ số i, i: 0 -> 9
=> x0 + x1 + ... + x9 = 6
=> tính bằng chia kẹo: (6 + 10 - 1)C(10 - 1) = 5008, rất thấp
ngoài ra còn có sol bin lift, f[val][2^k] là số hiện tại nếu nhảy 2^k bước và giá trị ban đầu là val
*/
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBlbmRsICdcbicKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBpbnQgbG9uZyBsb25nCiNkZWZpbmUgZ2V0TmFtZSh4KSAjeAojZGVmaW5lIHZpIHN0ZDo6dmVjdG9yPGludD4KI2RlZmluZSBpc3oodikgKGludCkgdi5zaXplKCkKI2RlZmluZSBwaWkgc3RkOjpwYWlyPGludCwgaW50PgojZGVmaW5lIGFsbCh2KSB2LmJlZ2luKCksIHYuZW5kKCkKI2RlZmluZSBsb29wIGNlcnIgPDwgImhlcmUiIDw8IGVuZGw7CiNkZWZpbmUgYnJlYWtMb29wIGlmKFRJTUUgPiAxKSBicmVhazsKI2RlZmluZSBUSU1FIDEuMCAqIGNsb2NrKCkgLyBDTE9DS1NfUEVSX1NFQwp1c2luZyBuYW1lc3BhY2Ugc3RkOwp0eXBlZGVmIGxvbmcgbG9uZyBsbDsKCgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBtYXhpbWl6ZShUICZhLCBUIGIpe2lmKGEgPCBiKSBhID0gYjt9CnRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIG1pbmltaXplKFQgJmEsIFQgYil7aWYoYSA+IGIpIGEgPSBiO30KCmxsIGFkZChsbCB4LCBsbCB5LCBsbCBwKXtyZXR1cm4gKHggJSBwICsgeSAlIHAgKyBwKSAlIHA7fQpsbCBtdWwobGwgeCwgbGwgeSwgbGwgcCl7cmV0dXJuICh4ICUgcCAqIHkgJSBwICsgcCkgJSBwO30KCnN0cnVjdCBpbmZvewogICAgaW50IGN1clZhbCwgaywgcCwgdjsKfXFbMjA3XTsKaW50IHByZVs2MDAwMl1bMjAyXSwgdCwgdiA9IDIsIG1heGlbMjAwMDAwN107CnZpIGNvbXByZXNzOwoKaW50IGdldElEKGludCB2YWwpewogICAgcmV0dXJuIGxvd2VyX2JvdW5kKGFsbChjb21wcmVzcyksIHZhbCkgLSBjb21wcmVzcy5iZWdpbigpICsgMTsKfQppbnQgZ2V0KGludCB2YWwsIGludCBwKXsKICAgIC8vZGlnaXQuY2xlYXIoKTsKICAgIHN0cmluZyBzOwogICAgaW50IHBvdzEwID0gMSwgcmVzID0gMCwgaWR4UCA9IGdldElEKHApOwogICAgZm9yKGludCBpID0gMDsgaSA8PSBsb2cxMCh2YWwpOyBpKyspCiAgICAgICAgcyArPSAoKHZhbCAvIHBvdzEwKSAlIDEwKSArICcwJywgcG93MTAgKj0gMTA7CiAgICBzb3J0KGFsbChzKSk7CgogICAgcG93MTAgPSAxOwogICAgZm9yKGludCBpID0gMDsgaSA8IGlzeihzKTsgaSsrKXsKICAgICAgICBpbnQgciA9IHNbaV0gLSAnMCc7CiAgICAgICAgcmVzID0gYWRkKHJlcywgbXVsKHIsIGFkZChwcmVbaSAqIHYgKyB2IC0gMV1baWR4UF0sIChpICogdiA9PSAwKSA/IDAgOiAtcHJlW2kgKiB2IC0gMV1baWR4UF0sIHApLCBwKSwgcCk7CiAgICAgICAgcG93MTAgKj0gMTA7CiAgICB9CiAgICByZXR1cm4gcmVzOwp9CgpzaWduZWQgbWFpbigpewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShudWxscHRyKTsKICAgICNkZWZpbmUgdGFzayAidCIKICAgIGlmIChmb3Blbih0YXNrIi5pbnAiLCAiciIpKXsKICAgICAgICBmcmVvcGVuKHRhc2siLmlucCIsICJyIiwgc3RkaW4pOwogICAgICAgIGZyZW9wZW4odGFzayIub3V0IiwgInciLCBzdGRvdXQpOwogICAgfQoKICAgIGNpbiA+PiB0OwogICAgZm9yKGludCBpID0gMTsgaSA8PSB0OyBpKyspewogICAgICAgIGludCBjdXJWYWwsIGssIHA7CiAgICAgICAgY2luID4+IGN1clZhbCA+PiBrID4+IHYgPj4gcDsKICAgICAgICBxW2ldID0ge2N1clZhbCwgaywgcCwgdn07CiAgICAgICAgbWF4aW1pemUobWF4aVtwXSwgdik7CiAgICAgICAgY29tcHJlc3MucHVzaF9iYWNrKHApOwogICAgfSBzb3J0KGFsbChjb21wcmVzcykpOyBjb21wcmVzcy5lcmFzZSh1bmlxdWUoYWxsKGNvbXByZXNzKSksIGNvbXByZXNzLmVuZCgpKTsKCiAgICBmb3IoaW50IHRjID0gMTsgdGMgPD0gdDsgdGMrKyl7CiAgICAgICAgLy9jaW4gPj4gY3VyVmFsID4+IGsgPj4gcDsKICAgICAgICAvL3YgPSAyOwogICAgICAgIGludCBjdXJWYWwgPSBxW3RjXS5jdXJWYWwsIGsgPSBxW3RjXS5rLCBwID0gcVt0Y10ucDsKICAgICAgICB2ID0gcVt0Y10udjsKCiAgICAgICAgaWYoIXByZVswXVtnZXRJRChwKV0pewogICAgICAgICAgICBpbnQgaWR4UCA9IGdldElEKHApOwogICAgICAgICAgICBwcmVbMF1baWR4UF0gPSAxOwogICAgICAgICAgICBpbnQgY3VyUG93ID0gMTsKICAgICAgICAgICAgZm9yKGludCBpID0gMTsgaSA8PSA2ICogbWF4aVtwXTsgaSsrKQogICAgICAgICAgICAgICAgY3VyUG93ID0gbXVsKGN1clBvdywgMTAsIHApLCBwcmVbaV1baWR4UF0gPSBhZGQoY3VyUG93LCBwcmVbaSAtIDFdW2lkeFBdLCBwKTsKICAgICAgICB9CgogICAgICAgIHVub3JkZXJlZF9tYXAgPGludCwgaW50PiBtcDsKICAgICAgICBpbnQgdGltZXIgPSAwOwogICAgICAgIHdoaWxlKCFtcC5jb3VudChjdXJWYWwpIGFuZCBrKXsKICAgICAgICAgICAgbXBbY3VyVmFsXSA9IHRpbWVyKys7CiAgICAgICAgICAgIGstLTsKICAgICAgICAgICAgY3VyVmFsID0gZ2V0KGN1clZhbCwgcCk7CiAgICAgICAgfQogICAgICAgIGlmKCFrKXsKICAgICAgICAgICAgY291dCA8PCBjdXJWYWwgPDwgJyAnOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaW50IGN5Y2xlTGVuID0gdGltZXIgLSBtcFtjdXJWYWxdOwogICAgICAgIGsgJT0gY3ljbGVMZW47CiAgICAgICAgd2hpbGUoay0tKQogICAgICAgICAgICBjdXJWYWwgPSBnZXQoY3VyVmFsLCBwKTsKICAgICAgICBjb3V0IDw8IGN1clZhbCA8PCAnICc7CgoKICAgIH0KCgoKfQovKgppZGVhOiB44butIGThu6VuZyB2w7JuZyBs4bq3cApjbSDEkXB0OiB44bqlcCB44buJIDUwMDgKZ+G7jWkgeGkgbMOgIHPhu5EgbMaw4bujbmcgc+G7kSBjaOG7ryBz4buRIGksIGk6IDAgLT4gOQo9PiB4MCArIHgxICsgLi4uICsgeDkgPSA2Cj0+IHTDrW5oIGLhurFuZyBjaGlhIGvhurlvOiAoNiArIDEwIC0gMSlDKDEwIC0gMSkgPSA1MDA4LCBy4bqldCB0aOG6pXAKbmdvw6BpIHJhIGPDsm4gY8OzIHNvbCBiaW4gbGlmdCwgZlt2YWxdWzJea10gbMOgIHPhu5EgaGnhu4duIHThuqFpIG7hur91IG5o4bqjeSAyXmsgYsaw4bubYyB2w6AgZ2nDoSB0cuG7iyBiYW4gxJHhuqd1IGzDoCB2YWwKKi8K