結果
問題 | No.1693 Invasion |
ユーザー |
![]() |
提出日時 | 2021-10-01 22:01:46 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 42 ms / 2,000 ms |
コード長 | 7,562 bytes |
コンパイル時間 | 2,861 ms |
コンパイル使用メモリ | 225,920 KB |
最終ジャッジ日時 | 2025-01-24 19:09:06 |
ジャッジサーバーID (参考情報) |
judge5 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 21 |
ソースコード
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")#include <bits/stdc++.h>using namespace std;typedef long long ll;#define pb(...) emplace_back(__VA_ARGS__)#define mp(a, b) make_pair(a, b)#define all(x) x.begin(), x.end()#define rall(x) x.rbegin(), x.rend()#define lscan(x) scanf("%I64d", &x)#define lprint(x) printf("%I64d", x)#define rep(i, n) for (ll i = 0; i < (n); i++)#define rep2(i, n) for (ll i = (ll)n - 1; i >= 0; i--)#define REP(i, l, r) for (ll i = l; i < (r); i++)#define REP2(i, l, r) for (ll i = (ll)r - 1; i >= (l); i--)#define siz(x) (ll) x.size()template <class T>using rque = priority_queue<T, vector<T>, greater<T>>;template <class T>bool chmin(T &a, const T &b) {if (b < a) {a = b;return 1;}return 0;}template <class T>bool chmax(T &a, const T &b) {if (b > a) {a = b;return 1;}return 0;}ll gcd(ll a, ll b) {if (a == 0)return b;if (b == 0)return a;ll cnt = a % b;while (cnt != 0) {a = b;b = cnt;cnt = a % b;}return b;}long long extGCD(long long a, long long b, long long &x, long long &y) {if (b == 0) {x = 1;y = 0;return a;}long long d = extGCD(b, a % b, y, x);y -= a / b * x;return d;}struct UnionFind {vector<ll> data;int num;UnionFind(int sz) {data.assign(sz, -1);num = sz;}bool unite(int x, int y) {x = find(x), y = find(y);if (x == y)return (false);if (data[x] > data[y])swap(x, y);data[x] += data[y];data[y] = x;num--;return (true);}int find(int k) {if (data[k] < 0)return (k);return (data[k] = find(data[k]));}ll size(int k) {return (-data[find(k)]);}bool same(int x, int y) {return find(x) == find(y);}};template <int mod>struct ModInt {int x;ModInt() : x(0) {}ModInt(int64_t y) : x(y >= 0 ? y % mod : (mod - (-y) % mod) % mod) {}ModInt &operator+=(const ModInt &p) {if ((x += p.x) >= mod)x -= mod;return *this;}ModInt &operator-=(const ModInt &p) {if ((x += mod - p.x) >= mod)x -= mod;return *this;}ModInt &operator*=(const ModInt &p) {x = (int)(1LL * x * p.x % mod);return *this;}ModInt &operator/=(const ModInt &p) {*this *= p.inverse();return *this;}ModInt operator-() const {return ModInt(-x);}ModInt operator+(const ModInt &p) const {return ModInt(*this) += p;}ModInt operator-(const ModInt &p) const {return ModInt(*this) -= p;}ModInt &operator++() {return *this += ModInt(1);}ModInt operator++(int) {ModInt tmp = *this;++*this;return tmp;}ModInt &operator--() {return *this -= ModInt(1);}ModInt operator--(int) {ModInt tmp = *this;--*this;return tmp;}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 inverse() const {int a = x, b = mod, u = 1, v = 0, t;while (b > 0) {t = a / b;swap(a -= t * b, b);swap(u -= t * v, v);}return ModInt(u);}ModInt pow(int64_t n) const {ModInt ret(1), mul(x);while (n > 0) {if (n & 1)ret *= mul;mul *= mul;n >>= 1;}return ret;}friend ostream &operator<<(ostream &os, const ModInt &p) {return os << p.x;}friend istream &operator>>(istream &is, ModInt &a) {int64_t t;is >> t;a = ModInt<mod>(t);return (is);}static int get_mod() {return mod;}};ll mpow2(ll x, ll n, ll mod) {ll ans = 1;while (n != 0) {if (n & 1)ans = ans * x % mod;x = x * x % mod;n = n >> 1;}return ans;}ll modinv2(ll a, ll mod) {ll b = mod, u = 1, v = 0;while (b) {ll t = a / b;a -= t * b;swap(a, b);u -= t * v;swap(u, v);}u %= mod;if (u < 0)u += mod;return u;}// constexpr int mod = 1000000007;constexpr int mod = 998244353;// constexpr int mod = 31607;using mint = ModInt<mod>;mint mpow(mint x, ll n) {mint ans = 1;while (n != 0) {if (n & 1)ans *= x;x *= x;n = n >> 1;}return ans;}// ----- library -------template <typename T>struct Combination {vector<T> _fac, _ifac;Combination() {init();}Combination(int n) {init(n);}void init(int n = 2000010) {_fac.resize(n + 1), _ifac.resize(n + 1);_fac[0] = 1;for (int i = 1; i <= n; i++)_fac[i] = _fac[i - 1] * i;_ifac[n] = _fac[n].inverse();for (int i = n; i >= 1; i--)_ifac[i - 1] = _ifac[i] * i;}T fac(int k) {return _fac[k];}T ifac(int k) {return _ifac[k];}T inv(int k) {return fac(k - 1) * ifac(k);}T P(int n, int k) {if (k < 0 || n < k)return 0;return fac(n) * ifac(n - k);}T C(int n, int k) {if (k < 0 || n < k)return 0;return fac(n) * ifac(n - k) * ifac(k);}T H(int n, int k) { // k個の区別できない玉をn個の区別できる箱に入れる場合の数if (n < 0 || k < 0)return 0;return k == 0 ? 1 : C(n + k - 1, k);}T second_stirling_number(int n, int k) { // n個の区別できる玉を、k個の区別しない箱に、各箱に1個以上玉が入るように入れる場合の数T ret = 0;for (int i = 0; i <= k; i++) {T tmp = C(k, i) * T(i).pow(n);ret += ((k - i) & 1) ? -tmp : tmp;}return ret * ifac(k);}T bell_number(int n, int k) { // n個の区別できる玉を、k個の区別しない箱に入れる場合の数if (n == 0)return 1;k = min(k, n);vector<T> pref(k + 1);pref[0] = 1;for (int i = 1; i <= k; i++) {if (i & 1)pref[i] = pref[i - 1] - ifac(i);elsepref[i] = pref[i - 1] + ifac(i);}T ret = 0;for (int i = 1; i <= k; i++)ret += T(i).pow(n) * ifac(i) * pref[k - i];return ret;}};using comb = Combination<mint>;// ----- library -------int main() {ios::sync_with_stdio(false);std::cin.tie(nullptr);cout << fixed << setprecision(15);int n, m;cin >> n >> m;vector<int> a(n);rep(i, n) cin >> a[i];vector<int> dp(m + 1, 1e9);dp[0] = 0;rep(i, m) rep(j, n) if (i + a[j] <= m) chmin(dp[i + a[j]], dp[i] + 1);mint ans = 0;comb comb;rep(i, m + 1) if (dp[i] <= 1e8) ans += comb.C(m - dp[i], i - dp[i]);cout << ans << endl;}