結果
問題 | No.137 貯金箱の焦り |
ユーザー |
![]() |
提出日時 | 2025-03-25 16:40:46 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 137 ms / 5,000 ms |
コード長 | 7,786 bytes |
コンパイル時間 | 4,452 ms |
コンパイル使用メモリ | 283,648 KB |
実行使用メモリ | 7,324 KB |
最終ジャッジ日時 | 2025-03-25 16:40:52 |
合計ジャッジ時間 | 6,213 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 23 |
ソースコード
#include <bits/stdc++.h> #include <bit> using namespace std; template <class T> using vc = vector<T>; template <class T> using vvc = vector<vc<T>>; template <class T> using vvvc = vector<vvc<T>>; template <class T> using vvvvc = vector<vvvc<T>>; template <class T> using vvvvvc = vector<vvvvc<T>>; #define vv(type, name, h, w) vector<vector<type>> name(h, vector<type>(w)) #define vvv(type, name, h, w, l) vector<vector<vector<type>>> name(h, vector<vector<type>>(w, vector<type>(l))) #define vvvv(type, name, a, b, c, d) vector<vector<vector<vector<type>>>> name(a, vector<vector<vector<type>>>(b, vector<vector<type>>(c, vector<type>(d)))) #define vvvvv(type, name, a, b, c, d, e) vector<vector<vector<vector<vector<type>>>>> name(a, vector<vector<vector<vector<type>>>>(b, vector<vector<vector<type>>>(c, vector<vector<type>>(d, vector<type>(e))))) #define elif else if #define FOR1(a) for (long long _ = 0; _ < (long long)(a); _++) #define FOR2(i, n) for (long long i = 0; i < (long long)(n); i++) #define FOR3(i, l, r) for (long long i = l; i < (long long)(r); i++) #define FOR4(i, l, r, c) for (long long i = l; i < (long long)(r); i += c) #define FOR1_R(a) for (long long _ = (long long)(a) - 1; _ >= 0; _--) #define FOR2_R(i, n) for (long long i = (long long)(n) - 1; i >= (long long)(0); i--) #define FOR3_R(i, l, r) for (long long i = (long long)(r) - 1; i >= (long long)(l); i--) #define FOR4_R(i, l, r, c) for (long long i = (long long)(r) - 1; i >= (long long)(l); i -= (c)) #define overload4(a, b, c, d, e, ...) e #define FOR(...) overload4(__VA_ARGS__, FOR4, FOR3, FOR2, FOR1)(__VA_ARGS__) #define FOR_R(...) overload4(__VA_ARGS__, FOR4_R, FOR3_R, FOR2_R, FOR1_R)(__VA_ARGS__) #define FOR_in(a, A) for (auto a: A) #define FOR_each(a, A) for (auto &&a: A) #define FOR_subset(t, s) for(long long t = (s); t >= 0; t = (t == 0 ? -1 : (t - 1) & (s))) #define all(x) x.begin(), x.end() #define len(x) ll(x.size()) int popcount(int x) { return __builtin_popcount(x); } int popcount(uint32_t x) { return __builtin_popcount(x); } int popcount(long long x) { return __builtin_popcountll(x); } int popcount(uint64_t x) { return __builtin_popcountll(x); } // __builtin_clz(x)は最上位bitからいくつ0があるか. int topbit(int x) { return (x == 0 ? -1 : 31 - __builtin_clz(x)); } int topbit(uint32_t x) { return (x == 0 ? -1 : 31 - __builtin_clz(x)); } int topbit(long long x) { return (x == 0 ? -1 : 63 - __builtin_clzll(x)); } int topbit(uint64_t x) { return (x == 0 ? -1 : 63 - __builtin_clzll(x)); } // 入力 void rd() {} void rd(char &c) { cin >> c; } void rd(string &s) { cin >> s; } void rd(int &x) { cin >> x; } void rd(uint32_t &x) { cin >> x; } void rd(long long &x) { cin >> x; } void rd(uint64_t &x) { cin >> x; } template<class T> void rd(vector<T> &v) { for (auto& x:v) rd(x); } void read() {} template <class H, class... T> void read(H &h, T &... t) { rd(h), read(t...); } #define CHAR(...) \ char __VA_ARGS__; \ read(__VA_ARGS__) #define STRING(...) \ string __VA_ARGS__; \ read(__VA_ARGS__) #define INT(...) \ int __VA_ARGS__; \ read(__VA_ARGS__) #define U32(...) \ uint32_t __VA_ARGS__; \ read(__VA_ARGS__) #define LL(...) \ long long __VA_ARGS__; \ read(__VA_ARGS__) #define U64(...) \ uint64_t __VA_ARGS__; \ read(__VA_ARGS__) #define VC(t, a, n) \ vector<t> a(n); \ read(a) #define VVC(t, a, h, w) \ vector<vector<t>> a(h, vector<t>(w)); \ read(a) //出力 void wt() {} void wt(const char c) { cout << c; } void wt(const string s) { cout << s; } void wt(int x) { cout << x; } void wt(uint32_t x) { cout << x; } void wt(long long x) { cout << x; } void wt(uint64_t x) { cout << x; } template<class T> void wt(const vector<T> v) { int n = v.size(); for (int i = 0; i < n; i++) { if (i) wt(' '); wt(v[i]); } } void print() { wt('\n'); } template <class Head, class... Tail> void print(Head &&head, Tail &&... tail) { wt(head); if (sizeof...(Tail)) wt(' '); print(forward<Tail>(tail)...); } ///////////////////////////////////////////////////////////////////////////////////////// template <int mod> struct modint { static constexpr uint32_t umod = uint32_t(mod); static_assert(umod < (uint32_t(1) << 31)); uint32_t val; static modint raw(uint32_t v) { modint x; x.val = v % umod; return x; } constexpr modint() : val(0) {} constexpr modint(uint32_t x) : val(x % umod) {} constexpr modint(uint64_t x) : val(x % umod) {} constexpr modint(unsigned __int128 x) : val(x % umod) {} constexpr modint(int x) : val((x %= umod) < 0 ? x + umod : x) {}; constexpr modint(long long x) : val((x %= umod) < 0 ? x + umod : x) {}; constexpr modint(__int128 x) : val((x %= umod) < 0 ? x + umod : x) {}; bool operator<(const modint &other) const { return val < other.val; } modint &operator+=(const modint &p) { if ((val += p.val) >= umod) val -= umod; return *this; } modint &operator-=(const modint &p) { if ((val += umod - p.val) >= umod) val -= umod; return *this; } modint &operator*=(const modint &p) { val = uint64_t(val) * p.val % umod; return *this; } modint &operator/=(const modint &p) { val = uint64_t(val) * p.inverse().val % umod; return *this; } modint operator-() const { return modint::raw(val ? umod - val : uint32_t(0)); } 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 val == p.val; } bool operator!=(const modint &p) const { return val != p.val; } modint inverse() const { int a = val, b = umod, s = 1, t = 0; while (1) { if (a == 1) return modint(s); t -= (b / a) * s; b %= a; if (b == 1) return modint(t + umod); s -= (a / b) * t; a %= b; } } modint pow(long long n) const { assert(n >= 0); modint res(1), a(val); while (n > 0) { if (n & 1) res *= a; a *= a; n >>= 1; } return res; } uint32_t get() const { return val; } static constexpr int get_mod() { return umod; } static constexpr pair<int,int> ntt_info() { if (mod == 167772161) return {25, 17}; if (mod == 469762049) return {26, 30}; if (mod == 754974721) return {24, 362}; if (mod == 880803841) return {23, 211}; if (mod == 998244353) return {23, 31}; return {-1, -1}; } }; template <int mod> void rd(modint<mod> &x) { uint32_t y; cin >> y; x = y; } template <int mod> void wt(modint<mod> x) { wt(x.val); } template <typename mint> mint fact(long long n) { static vector<mint> res = {1, 1}; static long long le = 1; while (le <= n){ le++; res.push_back(res[le - 1] * le); } return res[n]; } template <typename mint> mint fact_inv(long long n) { static vector<mint> res = {1, 1}; static long long le = 1; while (le <= n) { le++; res.push_back(res[le - 1] / le); } return res[n]; } template <typename mint> mint binom(long n, long r) { if (min(n, r) < 0) return 0; if (n < r) return 0; mint res = fact<mint>(n) * (fact_inv<mint>(n - r) * fact_inv<mint>(r)); return res; } using mint = modint<1234567891>; int main() { LL(N, M); VC(long long, A, N); long long S = 0; FOR_in(a, A) S += a; vector<mint> dp = {mint(1)}; while (M) { dp.resize(dp.size() + S); FOR_in(a, A) { FOR_R(c, dp.size() - a) { dp[a + c] += dp[c]; } } vector<mint> ndp((dp.size() + 1) / 2, mint(0)); FOR(c, dp.size()) { if ((M - c) % 2 == 0) ndp[c / 2] = dp[c]; } dp = ndp; M /= 2; } print(dp[0]); }