結果
問題 | No.1043 直列大学 |
ユーザー |
![]() |
提出日時 | 2020-05-01 22:03:20 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 38 ms / 2,000 ms |
コード長 | 2,742 bytes |
コンパイル時間 | 2,046 ms |
コンパイル使用メモリ | 171,624 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-12-22 19:27:41 |
合計ジャッジ時間 | 3,084 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 28 |
ソースコード
#include <bits/stdc++.h>using namespace std;#define SZ(x) (int)(x.size())#define REP(i, n) for(int i=0;i<(n);++i)#define FOR(i, a, b) for(int i=(a);i<(b);++i)#define RREP(i, n) for(int i=(int)(n)-1;i>=0;--i)#define RFOR(i, a, b) for(int i=(int)(b)-1;i>=(a);--i)#define ALL(a) a.begin(),a.end()#define DUMP(x) cerr<<#x<<" = "<<(x)<<endl#define DEBUG(x) cerr<<#x<<" = "<<(x)<<" (L"<<__LINE__<<")"<< endl;using ll = long long;using vi = vector<int>;using vvi = vector<vi>;using vll = vector<ll>;using vvll = vector<vll>;using P = pair<int, int>;const double EPS = 1e-8;const ll MOD = 1000000007;const int INF = INT_MAX / 2;const ll LINF = LLONG_MAX / 2;template <typename T1, typename T2>bool chmax(T1 &a, const T2 &b) {if (a < b) { a = b; return true; }return false;}template <typename T1, typename T2>bool chmin(T1 &a, const T2 &b) {if (a > b) { a = b; return true; }return false;}template<typename T1, typename T2>ostream &operator<<(ostream &os, const map<T1, T2> &mp);template<typename T>ostream &operator<<(ostream &os, const vector<T> &v);template<typename T1, typename T2>ostream &operator<<(ostream &os, const pair<T1, T2> &p) {os << "(" << p.first << ":" << p.second << ")";return os;}template<typename T1, typename T2>ostream &operator<<(ostream &os, const map<T1, T2> &mp) {os << "{";int a = 0;for (auto &tp : mp) {if (a) os << ", "; a = 1;os << tp;}return os << "}";}template<typename T>ostream &operator<<(ostream &os, const vector<T> &v) {os << "[";REP(i, SZ(v)) {if (i) os << ", ";os << v[i];}return os << "]";}int main() {cin.tie(0);ios::sync_with_stdio(false);cout << fixed << setprecision(10);int n, m; cin >> n >> m;vi V(n), R(m);REP(i, n) cin >> V[i];REP(i, m) cin >> R[i];int A, B; cin >> A >> B;int sumV = accumulate(ALL(V), 0);vll dpv(sumV+1);dpv[0] = 1;REP(i, n) {RREP(v, sumV) {if (v + V[i] <= sumV) (dpv[v + V[i]] += dpv[v]) %= MOD;}}int sumR = accumulate(ALL(R), 0);vll dpr(sumR+1);dpr[0] = 1;REP(i, m) {RREP(r, sumR) {if (r + R[i] <= sumR) (dpr[r + R[i]] += dpr[r]) %= MOD;}}vll sum(sumR+2);REP(i, sumR+1) {sum[i+1] = sum[i] + dpr[i];}ll ans = 0;REP(v, sumV+1) {if (dpv[v] == 0) continue;ll l = max((v - 1 + B) / B, 0), r = min(v / A, sumR);if (l > r) continue;ll sr = (sum[r+1] - sum[l] + MOD) % MOD;(ans += dpv[v] * sr) %= MOD;}if (ans > 0) --ans;else ans = MOD-1;cout << ans << endl;return 0;}