#include using namespace std; #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops") #define ALL(v) v.begin(),v.end() #define For(i,_) for(int i=0,i##end=_;i=0;--i) // [0,_) #define REP(i,_,__) for(int i=(__)-1,i##end=_;i>=i##end;--i) // [_,__) typedef long long ll; typedef unsigned long long ull; #define V vector #define pb push_back #define pf push_front #define qb pop_back #define qf pop_front #define eb emplace_back typedef pair pii; typedef pair pil; typedef pair pli; #define fi first #define se second const int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}},inf=0x3f3f3f3f,mod=998244353; const ll infl=0x3f3f3f3f3f3f3f3fll; templateinline bool ckmin(T &x,const T &y){return x>y?x=y,1:0;} templateinline bool ckmax(T &x,const T &y){return xsync_with_stdio(false),0;}();} template struct modint{ int val; inline modint(int v=0):val(v){} inline modint& operator=(int v){val=v;return *this;} inline modint& operator+=(const modint&k){val=val+k.val>=p?val+k.val-p:val+k.val;return *this;} inline modint& operator-=(const modint&k){val=val-k.val<0?val-k.val+p:val-k.val;return *this;} inline modint& operator*=(const modint&k){val=int(1ll*val*k.val%p);return *this;} inline modint& operator^=(int k){modint r(1),b=*this;for(;k;k>>=1,b*=b)if(k&1)r*=b;val=r.val;return *this;} inline modint& operator/=(modint k){return *this*=(k^=p-2);} inline modint& operator+=(int k){val=val+k>=p?val+k-p:val+k;return *this;} inline modint& operator-=(int k){val=valfriend modint operator+(modint a,T b){return a+=b;} templatefriend modint operator-(modint a,T b){return a-=b;} templatefriend modint operator*(modint a,T b){return a*=b;} templatefriend modint operator/(modint a,T b){return a/=b;} friend modint operator^(modint a,int b){return a^=b;} friend bool operator==(modint a,int b){return a.val==b;} friend bool operator!=(modint a,int b){return a.val!=b;} inline bool operator!()const{return !val;} inline modint operator-()const{return val?modint(p-val):modint(0);} inline modint operator++(int){modint t=*this;*this+=1;return t;} inline modint& operator++(){return *this+=1;} inline modint operator--(int){modint t=*this;*this-=1;return t;} inline modint& operator--(){return *this-=1;} }; using mi=modint; struct custom_hash{ static uint64_t splitmix64(uint64_t x){ x+=0x9e3779b97f4a7c15; x=(x^(x>>30))*0xbf58476d1ce4e5b9; x=(x^(x>>27))*0x94d049bb133111eb; return x^(x>>31); } size_t operator()(uint64_t x)const{ static const uint64_t FIXED_RANDOM=chrono::steady_clock::now().time_since_epoch().count(); return splitmix64(x+FIXED_RANDOM); } }; struct comb_table{ int n; Vfac,ifac; inline comb_table(int n=0):n(n),fac(n+1),ifac(n+1){init();} inline void init(){ fac[0]=1; FOR(i,1,n+1)fac[i]=fac[i-1]*i; ifac[n]=1/fac[n]; Rep(i,n)ifac[i]=ifac[i+1]*(i+1); } inline mi C(int x,int y){return xpw2(n+1); pw2[0]=1; FOR(i,1,n+1)pw2[i]=pw2[i-1]+pw2[i-1]; unordered_mapcnt; comb_table ct(n); while(n--){ ll x; scanf("%lld",&x); ++cnt[gcd(x,k)]; } unordered_mapf,g; f[1]=1; for(const auto &[i,j]:cnt){ int l=1,pw=1,tmp=k; while(l1)++l,tmp/=gcd(tmp,i); g=f; mi tot=pw2[j]-1; FOR(m,1,l+1){ mi coef=m(1ll*pw*i,k); for(const auto &[o,p]:f)g[gcd(1ll*pw*o,k)]+=coef*p; tot-=coef; } f.swap(g); } printf("%d\n",f[k]); } return 0; }