#include #include #include #include #include using namespace std; typedef long long LL; LL ww[101]; LL* e = ww + 50; const int MAXN = 4e6; const int MAXQ = 4e6; const LL P = 998244353; LL qpow(LL a, LL k, LL p) { LL c = 1; while (k) { if (k & 1) c = (c * a) % p; k >>= 1; a = (a * a) % p; } return c; } void primeroot(LL* e, const LL& P, const LL& g) { int s = 0; LL q = P - 1; while ((q & 1) == 0) {s++; q >>= 1;} LL w = qpow(g, q, P); LL invw = qpow(w, P - 2, P); for (int h = s; h >= 0; h--) { e[h] = w; e[-h] = invw; w = (w * w) % P; invw = (invw * invw) % P; } } void ntt(LL* f, const int& h, const int& type) { if (h == 0) return; LL f0[1 << (h - 1)], f1[1 << (h - 1)]; int n = 1 << h; for (int i = 0; i < n; i+=2) f0[i/2] = f[i]; ntt(f0, h - 1, type); for (int i = 1; i < n; i+=2) f1[i/2] = f[i]; ntt(f1, h - 1, type); LL w = e[type * h]; LL x = 1; for (int k = 0; k < n / 2; k++) { f[k] = f0[k] + x * f1[k]; f[k] %= P; f[k + n / 2] = f0[k] - x * f1[k]; f[k + n / 2] %= P; x *= w; x %= P; } } LL work(LL P){ LL x=P-1; LL p[1000],cnt=0; for(LL i=2;i*i<=x;i++){ if(x%i==0){ while(x%i==0){ x/=i; } p[cnt]=i; cnt++; } } if(x>1){ p[cnt]=x; cnt++; } for(LL g=2;g<=P-1;g++){ bool flag=1; for(int i=0;i