結果
| 問題 | No.2313 Product of Subsequence (hard) |
| ユーザー |
|
| 提出日時 | 2023-05-24 22:37:03 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 461 ms / 4,000 ms |
| コード長 | 1,789 bytes |
| 記録 | |
| コンパイル時間 | 4,300 ms |
| コンパイル使用メモリ | 272,228 KB |
| 最終ジャッジ日時 | 2025-02-13 04:42:33 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 27 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#include <atcoder/all>
using namespace atcoder;
using ll = long long;
using vll = vector<ll>;
using vvll = vector<vll>;
#define rep(i, n) for (ll i = 0; i < (ll) (n); i++)
using mint = modint998244353;
using vm = vector<mint>;
using vvm = vector<vm>;
vector<mint> fact, factinv, inv;
const ll mod = 998244353;
void prenCkModp(ll n) {
fact.resize(n + 5);
factinv.resize(n + 5);
inv.resize(n + 5);
fact[0] = fact[1] = factinv[0] = factinv[1] = inv[1] = 1;
for (ll i = 2; i < n + 5; i++) {
fact[i] = (fact[i - 1] * i);
inv[i] = (mod - ((inv[mod % i] * (mod / i))));
factinv[i] = (factinv[i - 1] * inv[i]);
}
}
mint nCk(ll n, ll k) {
if (n < k || k < 0) return 0;
return (fact[n] * ((factinv[k] * factinv[n - k])));
}
int main() {
ll N,K,k=0;
cin>>N>>K;
vll A(N);
rep(i,N){
cin>>A[i];
A[i]=gcd(A[i],K);
}
map<ll,ll> M;
for(ll d=1;d*d<=K;d++)if(K%d==0)M[d]=M[K/d]=1;
for(auto m:M)M[m.first]=k,k++;
vll D(k,0),KP(k);
for(auto m:M)KP[m.second]=m.first;
rep(i,N)D[M[A[i]]]++;
vvm DP(k+1,vm(k,0));
prenCkModp(N+1);
DP[0][0]=1;
unordered_map<ll,ll> MM;
for(auto m:M)MM[m.first]=m.second;
vvll nx(k,vll(k));
rep(i,k)rep(j,k)nx[i][j]=MM[gcd(K,KP[i]*KP[j])];
vector<mint> p2(N+1,1);
rep(i,N)p2[i+1]=p2[i]*2;
rep(i,k)rep(j,k){
if(DP[i][j].val()==0)continue;
ll r=j;
mint us=p2[D[i]];
rep(d,D[i]+1){
mint multi=nCk(D[i],d);
us-=multi;
DP[i+1][r]+=DP[i][j]*multi;
if(r==nx[r][i])break;
r=nx[r][i];
}
DP[i+1][r]+=DP[i][j]*us;
}
if(K==1)DP[k][k-1]-=1;
cout<<DP[k][k-1].val()<<endl;
}