結果
問題 | No.2578 Jewelry Store |
ユーザー |
|
提出日時 | 2023-12-08 11:25:46 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,458 ms / 3,500 ms |
コード長 | 15,644 bytes |
コンパイル時間 | 2,718 ms |
コンパイル使用メモリ | 213,972 KB |
最終ジャッジ日時 | 2025-02-18 09:25:10 |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 54 |
ソースコード
#line 1 "combined.cpp"#pragma region Macros#include <bits/stdc++.h>using namespace std;// input output utilsnamespace siro53_io {// https://maspypy.github.io/library/other/io_old.hppstruct has_val_impl {template <class T>static auto check(T &&x) -> decltype(x.val(), std::true_type{});template <class T> static auto check(...) -> std::false_type;};template <class T>class has_val : public decltype(has_val_impl::check<T>(std::declval<T>())) {};// debugtemplate <class T, enable_if_t<is_integral<T>::value, int> = 0>void dump(const T t) {cerr << t;}template <class T, enable_if_t<is_floating_point<T>::value, int> = 0>void dump(const T t) {cerr << t;}template <class T, typename enable_if<has_val<T>::value>::type * = nullptr>void dump(const T &t) {cerr << t.val();}void dump(__int128_t n) {if(n == 0) {cerr << '0';return;} else if(n < 0) {cerr << '-';n = -n;}string s;while(n > 0) {s += (char)('0' + n % 10);n /= 10;}reverse(s.begin(), s.end());cerr << s;}void dump(const string &s) { cerr << s; }void dump(const char *s) {int n = (int)strlen(s);for(int i = 0; i < n; i++) cerr << s[i];}template <class T1, class T2> void dump(const pair<T1, T2> &p) {cerr << '(';dump(p.first);cerr << ',';dump(p.second);cerr << ')';}template <class T> void dump(const vector<T> &v) {cerr << '{';for(int i = 0; i < (int)v.size(); i++) {dump(v[i]);if(i < (int)v.size() - 1) cerr << ',';}cerr << '}';}template <class T> void dump(const set<T> &s) {cerr << '{';for(auto it = s.begin(); it != s.end(); it++) {dump(*it);if(next(it) != s.end()) cerr << ',';}cerr << '}';}template <class Key, class Value> void dump(const map<Key, Value> &mp) {cerr << '{';for(auto it = mp.begin(); it != mp.end(); it++) {dump(*it);if(next(it) != mp.end()) cerr << ',';}cerr << '}';}template <class Key, class Value>void dump(const unordered_map<Key, Value> &mp) {cerr << '{';for(auto it = mp.begin(); it != mp.end(); it++) {dump(*it);if(next(it) != mp.end()) cerr << ',';}cerr << '}';}template <class T> void dump(const deque<T> &v) {cerr << '{';for(int i = 0; i < (int)v.size(); i++) {dump(v[i]);if(i < (int)v.size() - 1) cerr << ',';}cerr << '}';}template <class T> void dump(queue<T> q) {cerr << '{';while(!q.empty()) {dump(q.front());if((int)q.size() > 1) cerr << ',';q.pop();}cerr << '}';}void debug_print() { cerr << endl; }template <class Head, class... Tail>void debug_print(const Head &h, const Tail &...t) {dump(h);if(sizeof...(Tail)) dump(' ');debug_print(t...);}template <class T, enable_if_t<is_integral<T>::value, int> = 0>void print_single(const T t) {cout << t;}template <class T, enable_if_t<is_floating_point<T>::value, int> = 0>void print_single(const T t) {cout << t;}template <class T, typename enable_if<has_val<T>::value>::type * = nullptr>void print_single(const T t) {cout << t.val();}void print_single(__int128_t n) {if(n == 0) {cout << '0';return;} else if(n < 0) {cout << '-';n = -n;}string s;while(n > 0) {s += (char)('0' + n % 10);n /= 10;}reverse(s.begin(), s.end());cout << s;}void print_single(const string &s) { cout << s; }void print_single(const char *s) {int n = (int)strlen(s);for(int i = 0; i < n; i++) cout << s[i];}template <class T1, class T2> void print_single(const pair<T1, T2> &p) {print_single(p.first);cout << ' ';print_single(p.second);}template <class T> void print_single(const vector<T> &v) {for(int i = 0; i < (int)v.size(); i++) {print_single(v[i]);if(i < (int)v.size() - 1) cout << ' ';}}template <class T> void print_single(const set<T> &s) {for(auto it = s.begin(); it != s.end(); it++) {print_single(*it);if(next(it) != s.end()) cout << ' ';}}template <class T> void print_single(const deque<T> &v) {for(int i = 0; i < (int)v.size(); i++) {print_single(v[i]);if(i < (int)v.size() - 1) cout << ' ';}}template <class T> void print_single(queue<T> q) {while(!q.empty()) {print_single(q.front());if((int)q.size() > 1) cout << ' ';q.pop();}}void print() { cout << '\n'; }template <class Head, class... Tail>void print(const Head &h, const Tail &...t) {print_single(h);if(sizeof...(Tail)) print_single(' ');print(t...);}// inputtemplate <class T, enable_if_t<is_integral<T>::value, int> = 0>void input_single(T &t) {cin >> t;}template <class T, enable_if_t<is_floating_point<T>::value, int> = 0>void input_single(T &t) {cin >> t;}template <class T, typename enable_if<has_val<T>::value>::type * = nullptr>void input_single(T &t) {cin >> t;}void input_single(__int128_t &n) {string s;cin >> s;if(s == "0") {n = 0;return;}bool is_minus = false;if(s[0] == '-') {s = s.substr(1);is_minus = true;}n = 0;for(int i = 0; i < (int)s.size(); i++) n = n * 10 + (int)(s[i] - '0');if(is_minus) n = -n;}void input_single(string &s) { cin >> s; }template <class T1, class T2> void input_single(pair<T1, T2> &p) {input_single(p.first);input_single(p.second);}template <class T> void input_single(vector<T> &v) {for(auto &e : v) input_single(e);}void input() {}template <class Head, class... Tail> void input(Head &h, Tail &...t) {input_single(h);input(t...);}}; // namespace siro53_io#ifdef DEBUG#define debug(...) \cerr << __LINE__ << " [" << #__VA_ARGS__ << "]: ", debug_print(__VA_ARGS__)#else#define debug(...) (void(0))#endif// io setupstruct Setup {Setup() {cin.tie(0);ios::sync_with_stdio(false);cout << fixed << setprecision(15);}} __Setup;using namespace siro53_io;// typesusing ll = long long;using i128 = __int128_t;// input macros#define INT(...) \int __VA_ARGS__; \input(__VA_ARGS__)#define LL(...) \ll __VA_ARGS__; \input(__VA_ARGS__)#define STRING(...) \string __VA_ARGS__; \input(__VA_ARGS__)#define CHAR(...) \char __VA_ARGS__; \input(__VA_ARGS__)#define DBL(...) \double __VA_ARGS__; \input(__VA_ARGS__)#define LD(...) \long double __VA_ARGS__; \input(__VA_ARGS__)#define UINT(...) \unsigned int __VA_ARGS__; \input(__VA_ARGS__)#define ULL(...) \unsigned long long __VA_ARGS__; \input(__VA_ARGS__)#define VEC(name, type, len) \vector<type> name(len); \input(name);#define VEC2(name, type, len1, len2) \vector name(len1, vector<type>(len2)); \input(name);// other macros// https://trap.jp/post/1224/#define OVERLOAD3(_1, _2, _3, name, ...) name#define ALL(v) (v).begin(), (v).end()#define RALL(v) (v).rbegin(), (v).rend()#define REP1(i, n) for(int i = 0; i < int(n); i++)#define REP2(i, a, b) for(int i = (a); i < int(b); i++)#define REP(...) OVERLOAD3(__VA_ARGS__, REP2, REP1)(__VA_ARGS__)#define SORT(v) sort(ALL(v))#define RSORT(v) sort(RALL(v))#define UNIQUE(v) \sort(ALL(v)), (v).erase(unique(ALL(v)), (v).end()), v.shrink_to_fit()#define REV(v) reverse(ALL(v))#define SZ(v) ((int)(v).size())#define MIN(v) (*min_element(ALL(v)))#define MAX(v) (*max_element(ALL(v)))// util constconst int INF = 1 << 30;const ll LLINF = 1LL << 60;constexpr int MOD = 1000000007;constexpr int MOD2 = 998244353;const int dx[4] = {1, 0, -1, 0};const int dy[4] = {0, 1, 0, -1};// util functionsvoid Case(int i) { cout << "Case #" << i << ": "; }int popcnt(int x) { return __builtin_popcount(x); }int popcnt(ll x) { return __builtin_popcountll(x); }template <class T> inline bool chmax(T &a, T b) {return (a < b ? a = b, true : false);}template <class T> inline bool chmin(T &a, T b) {return (a > b ? a = b, true : false);}template <class T, size_t dim>auto make_vector_impl(vector<size_t>& sizes, const T &e) {if constexpr(dim == 1) {return vector(sizes[0], e);} else {size_t n = sizes[dim - 1];sizes.pop_back();return vector(n, make_vector_impl<T, dim - 1>(sizes, e));}}template <class T, size_t dim>auto make_vector(const size_t (&sizes)[dim], const T &e) {vector<size_t> s(dim);for(size_t i = 0; i < dim; i++) s[i] = sizes[dim - i - 1];return make_vector_impl<T, dim>(s, e);}#pragma endregion Macros#line 2 "/Users/siro53/kyo-pro/compro_library/modint/modint.hpp"#line 6 "/Users/siro53/kyo-pro/compro_library/modint/modint.hpp"template <int mod> class ModInt {public:ModInt() : x(0) {}ModInt(long long y): x(y >= 0 ? y % umod() : (umod() - (-y) % umod()) % umod()) {}unsigned int val() const { return x; }ModInt &operator+=(const ModInt &p) {if((x += p.x) >= umod()) x -= umod();return *this;}ModInt &operator-=(const ModInt &p) {if((x += umod() - p.x) >= umod()) x -= umod();return *this;}ModInt &operator*=(const ModInt &p) {x = (unsigned int)(1ULL * x * p.x % umod());return *this;}ModInt &operator/=(const ModInt &p) {*this *= p.inv();return *this;}ModInt operator-() const { return ModInt(-(long long)x); }ModInt operator+(const ModInt &p) const { return ModInt(*this) += p; }ModInt operator-(const ModInt &p) const { return ModInt(*this) -= p; }ModInt operator*(const ModInt &p) const { return ModInt(*this) *= p; }ModInt operator/(const ModInt &p) const { return ModInt(*this) /= p; }bool operator==(const ModInt &p) const { return x == p.x; }bool operator!=(const ModInt &p) const { return x != p.x; }ModInt inv() const {long long a = x, b = mod, u = 1, v = 0, t;while(b > 0) {t = a / b;std::swap(a -= t * b, b);std::swap(u -= t * v, v);}return ModInt(u);}ModInt pow(unsigned long long n) const {ModInt ret(1), mul(x);while(n > 0) {if(n & 1) ret *= mul;mul *= mul;n >>= 1;}return ret;}friend std::ostream &operator<<(std::ostream &os, const ModInt &p) {return os << p.x;}friend std::istream &operator>>(std::istream &is, ModInt &a) {long long t;is >> t;a = ModInt<mod>(t);return (is);}static constexpr int get_mod() { return mod; }private:unsigned int x;static constexpr unsigned int umod() { return mod; }};#line 334 "combined.cpp"using mint = ModInt<MOD2>;struct FastFactorize {ll mul(ll a, ll b, ll c) { return (__int128)a * b % c; }ll power(ll a, ll b, ll mod) {ll res = 1;while(b) {if(b & 1) { res = mul(res, a, mod); }a = mul(a, a, mod);b >>= 1;}return res;}bool isPrime(ll n) {if(!(n & 1) && n != 2) { return false; }ll d = n - 1;int s = __builtin_ctzll(d);d >>= s;vector<int> A;if(n <= 1000000000) {A = {2, 3, 5, 7};} else {A = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37};}for(int a : A) {ll p = power(a, d, n);int i = s;while(p != 1 && p != n - 1 && a % n && (--i)) { p = mul(p, p, n); }if(p != n - 1 && i != s) { return false; }}return true;}ll rho(ll n) {auto f = [&](ll a) { return mul(a, a, n) + 1; };ll x = 0, y = 0, p = 2, q;int i = 1, t = 0;while((t++) % 40 || gcd(p, n) == 1) {if(x == y) {x = ++i;y = f(x);}if(q = mul(p, abs(y - x), n)) { p = q; }x = f(x);y = f(f(y));}return gcd(p, n);}vector<ll> factor(ll n) {if(n == 1) { return {}; }if(isPrime(n)) { return {n}; }ll a = rho(n);assert(a != n && a != 1);auto l = factor(a), r = factor(n / a);l.insert(l.end(), r.begin(), r.end());return l;}};void solve(ll m, const vector<ll>& ps) {INT(N, B, C, D);VEC(A, ll, N);vector<mint> W(N);W[0] = B;REP(i, 1, N) W[i] = W[i - 1] * C + D;int sz = SZ(ps);if(sz == 0) {mint ans = 1;REP(i, N) if(A[i] == 1) ans *= (W[i] + 1);ans -= 1;print(ans);return;}vector<mint> g(1 << sz, 1);REP(i, N) {if(m % A[i] != 0) continue;int mask = 0;REP(j, sz) if((m / ps[j]) % A[i] == 0) mask |= (1 << j);g[mask] *= (W[i] + 1);}// REP(i, 1 << sz) REP(j, 1 << sz) if((i & j) == i) g[i] *= a[j];for(int i = 1; i < (1 << sz); i <<= 1) {REP(j, 1 << sz) if((i & j) == 0) g[j] *= g[i | j];}mint ans = 0;REP(i, 1 << sz) ans += mint((popcnt(i) & 1) ? -1 : 1) * g[i];print(ans);}int main() {INT(T);LL(m);FastFactorize f;auto ps = f.factor(m);UNIQUE(ps);debug(ps);while(T--) solve(m, ps);}