#include #include using namespace std; vector isprime; vector sieve(int n){ vector prime; isprime[1]=false; for (int i=2;i<=n;i++){ if (!isprime[i]) continue; prime.push_back(i); for (int j=i*2;j<=n;j+=i){ isprime[j]=false; } } return prime; } int main(){ using mint=atcoder::modint998244353; int m=1e6+10; isprime.assign(m+1,true); auto ps=sieve(m); int n,k; cin>>n>>k; vector a(n); map> mp; for (int i=0;i>a[i]; for (int p:ps){ int k=0; while (a[i]%p==0){ mp[p][++k]++; a[i]/=p; } if (p*p>a[i]) break; } if (a[i]>1) mp[a[i]][1]++; } int cnt=n-n/k; mint ans=1; for (auto [p,mp2]:mp){ for (auto [i,j]:mp2){ if (j>cnt) ans*=p; } } cout<