結果
| 問題 |
No.2313 Product of Subsequence (hard)
|
| ユーザー |
hitonanode
|
| 提出日時 | 2023-05-24 22:11:53 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 1,222 ms / 4,000 ms |
| コード長 | 1,773 bytes |
| コンパイル時間 | 1,747 ms |
| コンパイル使用メモリ | 130,180 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-12-23 22:26:34 |
| 合計ジャッジ時間 | 12,758 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 27 |
ソースコード
#define FOR(i, begin, end) for(int i=(begin),i##_end_=(end);i<i##_end_;i++)
#define IFOR(i, begin, end) for(int i=(end)-1,i##_begin_=(begin);i>=i##_begin_;i--)
#define REP(i, n) FOR(i,0,n)
#define IREP(i, n) IFOR(i,0,n)
#include <algorithm>
#include <iostream>
#include <map>
#include <utility>
#include <vector>
#include <atcoder/modint>
using namespace std;
int main() {
cin.tie(nullptr), ios::sync_with_stdio(false);
int N;
int K;
cin >> N >> K;
vector<pair<int, int>> fac;
int len = 1;
for (int p = 2; p * p <= K; ++p) {
if (K % p) continue;
fac.emplace_back(p, 0);
while (K % p == 0) {
K /= p;
++fac.back().second;
}
len *= 1 + fac.back().second;
}
if (K > 1) fac.emplace_back(K, 1), len *= 2;
vector<atcoder::modint998244353> dp(len);
dp.front() = 1;
map<vector<int>, int> mp;
while (N--) {
long long a;
cin >> a;
vector<int> ds;
for (auto [p, deg] : fac) {
int m = 0;
while (a % p == 0) a /= p, ++m;
ds.push_back(min(m, deg));
}
mp[ds]++;
}
for (auto [ds, cnt] : mp) {
vector<int> to(dp.size(), -1);
auto rec = [&](auto &&self, int d, int prv, int nxt) -> void {
if (d == int(fac.size())) {
to.at(prv) = nxt;
} else {
int m = fac.at(d).second;
REP(h, m + 1) {
self(self, d + 1, prv * (m + 1) + h, nxt * (m + 1) + min(m, ds.at(d) + h));
}
}
};
rec(rec, 0, 0, 0);
while (cnt--) IREP(i, dp.size()) dp.at(to.at(i)) += dp.at(i);
}
dp.front() -= 1;
cout << dp.back().val() << endl;
}
hitonanode