結果
問題 | No.2578 Jewelry Store |
ユーザー | hitonanode |
提出日時 | 2023-12-06 00:58:09 |
言語 | C++23 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 974 ms / 3,500 ms |
コード長 | 5,401 bytes |
コンパイル時間 | 1,726 ms |
コンパイル使用メモリ | 124,688 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-09-27 00:49:03 |
合計ジャッジ時間 | 10,242 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,376 KB |
testcase_02 | AC | 8 ms
5,376 KB |
testcase_03 | AC | 6 ms
5,376 KB |
testcase_04 | AC | 23 ms
5,376 KB |
testcase_05 | AC | 6 ms
5,376 KB |
testcase_06 | AC | 9 ms
5,376 KB |
testcase_07 | AC | 23 ms
5,376 KB |
testcase_08 | AC | 6 ms
5,376 KB |
testcase_09 | AC | 23 ms
5,376 KB |
testcase_10 | AC | 43 ms
5,376 KB |
testcase_11 | AC | 6 ms
5,376 KB |
testcase_12 | AC | 6 ms
5,376 KB |
testcase_13 | AC | 5 ms
5,376 KB |
testcase_14 | AC | 6 ms
5,376 KB |
testcase_15 | AC | 5 ms
5,376 KB |
testcase_16 | AC | 43 ms
5,376 KB |
testcase_17 | AC | 22 ms
5,376 KB |
testcase_18 | AC | 5 ms
5,376 KB |
testcase_19 | AC | 14 ms
5,376 KB |
testcase_20 | AC | 23 ms
5,376 KB |
testcase_21 | AC | 23 ms
5,376 KB |
testcase_22 | AC | 8 ms
5,376 KB |
testcase_23 | AC | 14 ms
5,376 KB |
testcase_24 | AC | 7 ms
5,376 KB |
testcase_25 | AC | 9 ms
5,376 KB |
testcase_26 | AC | 8 ms
5,376 KB |
testcase_27 | AC | 158 ms
5,376 KB |
testcase_28 | AC | 232 ms
5,376 KB |
testcase_29 | AC | 221 ms
5,376 KB |
testcase_30 | AC | 271 ms
5,376 KB |
testcase_31 | AC | 171 ms
5,376 KB |
testcase_32 | AC | 110 ms
5,376 KB |
testcase_33 | AC | 140 ms
5,376 KB |
testcase_34 | AC | 175 ms
5,376 KB |
testcase_35 | AC | 44 ms
5,376 KB |
testcase_36 | AC | 150 ms
5,376 KB |
testcase_37 | AC | 79 ms
5,376 KB |
testcase_38 | AC | 98 ms
5,376 KB |
testcase_39 | AC | 90 ms
5,376 KB |
testcase_40 | AC | 95 ms
5,376 KB |
testcase_41 | AC | 85 ms
5,376 KB |
testcase_42 | AC | 78 ms
5,376 KB |
testcase_43 | AC | 125 ms
5,376 KB |
testcase_44 | AC | 72 ms
5,376 KB |
testcase_45 | AC | 107 ms
5,376 KB |
testcase_46 | AC | 84 ms
5,376 KB |
testcase_47 | AC | 496 ms
5,376 KB |
testcase_48 | AC | 215 ms
5,376 KB |
testcase_49 | AC | 974 ms
5,376 KB |
testcase_50 | AC | 906 ms
5,376 KB |
testcase_51 | AC | 87 ms
5,376 KB |
testcase_52 | AC | 303 ms
5,376 KB |
testcase_53 | AC | 37 ms
5,376 KB |
ソースコード
#include <iostream> #include <vector> using namespace std; uint32_t rand_int() // XorShift random integer generator { static uint32_t x = 123456789, y = 362436069, z = 521288629, w = 88675123; uint32_t t = x ^ (x << 11); x = y; y = z; z = w; return w = (w ^ (w >> 19)) ^ (t ^ (t >> 8)); } double rand_double() { return (double)rand_int() / UINT32_MAX; } #include <algorithm> #include <array> #include <cassert> #include <numeric> #include <vector> namespace SPRP { // http://miller-rabin.appspot.com/ const std::vector<std::vector<__int128>> bases{ {126401071349994536}, // < 291831 {336781006125, 9639812373923155}, // < 1050535501 (1e9) {2, 2570940, 211991001, 3749873356}, // < 47636622961201 (4e13) {2, 325, 9375, 28178, 450775, 9780504, 1795265022} // <= 2^64 }; inline int get_id(long long n) { if (n < 291831) { return 0; } else if (n < 1050535501) { return 1; } else if (n < 47636622961201) return 2; else { return 3; } } } // namespace SPRP // Miller-Rabin primality test // https://ja.wikipedia.org/wiki/%E3%83%9F%E3%83%A9%E3%83%BC%E2%80%93%E3%83%A9%E3%83%93%E3%83%B3%E7%B4%A0%E6%95%B0%E5%88%A4%E5%AE%9A%E6%B3%95 // Complexity: O(lg n) per query struct { long long modpow(__int128 x, __int128 n, long long mod) noexcept { __int128 ret = 1; for (x %= mod; n; x = x * x % mod, n >>= 1) ret = (n & 1) ? ret * x % mod : ret; return ret; } bool operator()(long long n) noexcept { if (n < 2) return false; if (n % 2 == 0) return n == 2; int s = __builtin_ctzll(n - 1); for (__int128 a : SPRP::bases[SPRP::get_id(n)]) { if (a % n == 0) continue; a = modpow(a, (n - 1) >> s, n); bool may_composite = true; if (a == 1) continue; for (int r = s; r--; a = a * a % n) { if (a == n - 1) may_composite = false; } if (may_composite) return false; } return true; } } is_prime; struct { // Pollard's rho algorithm: find factor greater than 1 long long find_factor(long long n) { assert(n > 1); if (n % 2 == 0) return 2; if (is_prime(n)) return n; long long c = 1; auto f = [&](__int128 x) -> long long { return (x * x + c) % n; }; for (int t = 1;; t++) { for (c = 0; c == 0 or c + 2 == n;) c = rand_int() % n; long long x0 = t, m = std::max(n >> 3, 1LL), x, ys, y = x0, r = 1, g, q = 1; do { x = y; for (int i = r; i--;) y = f(y); long long k = 0; do { ys = y; for (int i = std::min(m, r - k); i--;) y = f(y), q = __int128(q) * std::abs(x - y) % n; g = std::__gcd<long long>(q, n); k += m; } while (k < r and g <= 1); r <<= 1; } while (g <= 1); if (g == n) { do { ys = f(ys); g = std::__gcd(std::abs(x - ys), n); } while (g <= 1); } if (g != n) return g; } } std::vector<long long> operator()(long long n) { std::vector<long long> ret; while (n > 1) { long long f = find_factor(n); if (f < n) { auto tmp = operator()(f); ret.insert(ret.end(), tmp.begin(), tmp.end()); } else ret.push_back(n); n /= f; } std::sort(ret.begin(), ret.end()); return ret; } long long euler_phi(long long n) { long long ret = 1, last = -1; for (auto p : this->operator()(n)) ret *= p - (last != p), last = p; return ret; } } FactorizeLonglong; #include <atcoder/modint> using mint = atcoder::modint998244353; long long m; vector<pair<long long, int>> facs; template <typename T, typename F> void abstract_fwht(std::vector<T> &seq, F f) { const int n = seq.size(); assert(__builtin_popcount(n) == 1); for (int w = 1; w < n; w *= 2) { for (int i = 0; i < n; i += w * 2) { for (int j = 0; j < w; j++) { f(seq[i + j], seq[i + j + w]); } } } } mint solve() { int n, B, C, D; cin >> n >> B >> C >> D; vector<mint> dp(1 << facs.size(), 1); mint W = B; while (n--) { long long a; cin >> a; int S = 0; bool is_bad = false; for (auto [p, d] : facs) { S *= 2; while (d and a % p == 0) a /= p, --d; if (!d) ++S; } if (a > 1) is_bad = true; if (!is_bad) dp.at(S) *= W + 1; W = W * C + D; } abstract_fwht(dp, [](mint &lo, mint &hi) { hi *= lo; }); abstract_fwht(dp, [](mint &lo, mint &hi) { hi -= lo; }); return dp.back() - (m == 1); } int main() { cin.tie(nullptr), ios::sync_with_stdio(false); int T; cin >> T >> m; auto factors = FactorizeLonglong(m); sort(factors.begin(), factors.end()); for (auto p : factors) { if (facs.empty() or facs.back().first != p) facs.emplace_back(p, 0); facs.back().second++; } while (T--) cout << solve().val() << '\n'; }