//#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef signed long long ll; #define pp(...) (void)printf(__VA_ARGS__) #define For(x,to) for(x=0;x<(to);x++) #define ForAuto(x,arr) for(auto& x:arr) #define ForBeginEnd(x,c) for(__typeof(c.begin()) x=c.begin();x!=c.end();x++) #define All(a) (a.begin()),(a.end()) #define Zeros(a) memset(a,0,sizeof(a)) #define Minus(a) memset(a,0xff,sizeof(a)) #define PI 3.14159265 #define EPS (1e-10) #define EPS_eq(a,b) (abs((a)-(b)) < EPS) #pragma GCC diagnostic ignored "-Wconversion" //#define int long long #define INF 1000*1000 int dxy[] = {0, 1, 0, -1, 0}; typedef pair P; void pp_int(int x){ printf("%d\n", x); }; int i,j,k; ll M = 100000009; //------------------------------------------------- void init() { ios::sync_with_stdio(false); } map fact(ll n){ map mp_fact; ll a = 2; while (n > 1) { while (n % a == 0) { mp_fact[a]++; n /= a; } a++; } return mp_fact; } signed main() { init(); int q;cin>>q; while(q--){ ll seed, N,K,B; vector xn; cin>>seed>>N>>K>>B; auto mp_fact = fact(B); xn.push_back(seed); map > mp_set; For(i, N){ ll prev = xn.back(); ll next = 1 + (prev * prev + prev * 12345) % M; xn.push_back(next); } For(i, xn.size()){ for(auto it : mp_fact) { ll factor = it.first; ll cnt = 0; ll t = xn[i]; while(t % factor == 0) { t /= factor; cnt++; } mp_set[factor].push_back(cnt); } } ll mn = INF; // printf("seed: %lld\n", seed); // // for(auto it : mp_fact){ // printf("mp_fact[%lld] = %lld\n", it.first, it.second); // } // // For(i, xn.size()){ // printf("xn[%d] = %lld\n", i, xn[i]); // } for(auto it : mp_set) { // printf("mp_set_first: %d\n", it.first); sort(it.second.begin(), it.second.end()); ll cnt = 0; for(i = 0; i < K; i++){ cnt += it.second[i]; } ll factor = it.first; mn = min(mn, cnt / mp_fact[factor]); } printf("%lld\n", mn); } return 0; }