結果
| 問題 |
No.1043 直列大学
|
| コンテスト | |
| ユーザー |
opt
|
| 提出日時 | 2020-05-01 23:25:24 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 38 ms / 2,000 ms |
| コード長 | 3,516 bytes |
| コンパイル時間 | 2,837 ms |
| コンパイル使用メモリ | 197,296 KB |
| 最終ジャッジ日時 | 2025-01-10 05:35:00 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 28 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
using V = vector<int>;
using Vll = vector<ll>;
using Vld = vector<ld>;
using Vbo = vector<bool>;
using VV = vector<V>;
using VVll = vector<Vll>;
using VVld = vector<Vld>;
using VVbo = vector<Vbo>;
using P = pair<int, int>;
using Pll = pair<ll, ll>;
using Pld = pair<ld, ld>;
#define rep2(i, m, n) for(ll i=int(m); i<int(n); ++i)
#define drep2(i, m, n) for(ll i=int(m)-1; i>=int(n); --i)
#define rep(i, n) rep2(i, 0, n)
#define drep(i, n) drep2(i, n, 0)
#define all(a) a.begin(), a.end()
struct fast_ios { fast_ios(){ cin.tie(0); ios::sync_with_stdio(false); cout << fixed << setprecision(20); }; } fast_ios_;
template<typename T> inline bool chmin(T &a, T b) { if (a > b) { a = b; return true; } return false; }
template<typename T> inline bool chmax(T &a, T b) { if (a < b) { a = b; return true; } return false; }
template<typename T1, typename T2> istream &operator>>(istream &is, pair<T1, T2> &p) { is >> p.first >> p.second; return is; }
template<typename T1, typename T2> ostream &operator<<(ostream &os, const pair<T1, T2> &p) { os << "(" << p.first << ", " << p.second << ")"; return os; }
template<typename T> istream &operator>>(istream &is, vector<T> &v) { for (auto &e : v) is >> e; return is; }
template<typename T> ostream &operator<<(ostream &os, const vector<T> &v) { for (auto &e : v) os << e << " "; return os; }
template<typename T> inline int count_between(vector<T> &a, T l, T r) { return lower_bound(all(a), r) - lower_bound(all(a), l); } // [l, r)
inline int Log2(ll x) { int k; for (k = 0; x > 0; ++k) x >>= 1; return k; } // number of binary digits
const int INF = 1<<30;
const ll INFll = 1ll<<62;
const ld EPS = 1e-10;
const int MOD = int(1e9)+7;
struct mint {
ll x;
mint(ll xx=0) : x(xx) { if (xx >= MOD || xx <= -MOD) x = xx % MOD; if (x < 0) x += MOD; }
mint operator-() const { return mint(-x);}
mint& operator+=(const mint a) { if ((x += a.x) >= MOD) x -= MOD; return *this; }
mint& operator-=(const mint a) { if ((x -= a.x) < 0) x += MOD; return *this; }
mint& operator*=(const mint a) { (x *= a.x) %= MOD; return *this;}
mint operator+(const mint a) const { return mint(*this) += a;}
mint operator-(const mint a) const { return mint(*this) -= a;}
mint operator*(const mint a) const { return mint(*this) *= a;}
mint pow(ll t) const {
if (!t) return 1;
mint a = pow(t>>1);
a *= a;
if (t&1) a *= *this;
return a;
}
mint& operator/=(const mint r) {
ll a = r.x, b = MOD, u = 1, v = 0;
while (b) {
ll t = a / b;
a -= t * b; swap(a, b);
u -= t * v; swap(u, v);
}
x = x * u % MOD;
if (x < 0) x += MOD;
return *this;
}
mint operator/(const mint a) const { return mint(*this) /= a;}
};
// istream& operator>>(istream& is, mint& a) { return is >> a.x;}
ostream& operator<<(ostream& os, const mint& a) { return os << a.x;}
using Vm = vector<mint>;
int main() {
ll n, m; cin >> n >> m;
V v(n), r(m); cin >> v >> r;
ll a, b; cin >> a >> b;
int N = n * 1000;
int M = m * 1000;
Vm dpv(N+1), dpr(M+1);
dpv[0] = 1;
dpr[0] = 1;
rep(i, n) drep(j, N) if (j >= v[i]) dpv[j] += dpv[j-v[i]];
rep(i, m) drep(j, M) if (j >= r[i]) dpr[j] += dpr[j-r[i]];
Vm s(M+1);
drep(i, M) s[i] = s[i+1] + dpr[i];
mint ans = -1;
rep(i, N+1) {
int j = (i+b-1)/b;
if (j <= M) ans += dpv[i] * s[j];
j = i/a + 1;
if (j <= M) ans -= dpv[i] * s[j];
}
cout << ans << "\n";
return 0;
}
opt