結果
| 問題 | No.3461 Min GCD |
| コンテスト | |
| ユーザー |
👑 |
| 提出日時 | 2026-02-28 16:07:14 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 665 ms / 2,000 ms |
| コード長 | 2,001 bytes |
| 記録 | |
| コンパイル時間 | 4,131 ms |
| コンパイル使用メモリ | 353,960 KB |
| 実行使用メモリ | 208,896 KB |
| 最終ジャッジ日時 | 2026-02-28 16:07:24 |
| 合計ジャッジ時間 | 9,319 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge7 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 21 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
constexpr ll INF = 1e12;
constexpr int LIMIT = 1e5 + 10;
vector<int> divisors(int n) {
vector<int> lower, upper;
for (int i = 1; i * i <= n; i++) {
if (n % i == 0) {
lower.push_back(i);
if (i != n / i) {
upper.push_back(n / i);
}
}
}
reverse(upper.begin(), upper.end());
vector<int> divisor;
for (int l: lower) {
divisor.push_back(l);
}
for (int u: upper) {
divisor.push_back(u);
}
return divisor;
}
void solve() {
int N;
ll K;
cin >> N >> K;
vector<int> A(N);
for (int i = 0; i < N; i++) {
cin >> A[i];
}
vector<int> B(N);
for (int i = 0; i < N; i++) {
cin >> B[i];
}
vector need_op(N, vector<pair<int, ll>>());
for (int i = 0; i < N; i++) {
vector<pair<int, int>> op;
for (int div: divisors(A[i])) {
op.emplace_back(div, ((div - B[i]) % div + div) % div);
}
ll min_cnt = INF;
reverse(op.begin(), op.end());
for (auto [key, val]: op) {
min_cnt = min(min_cnt, (ll)val);
need_op[i].emplace_back(key, min_cnt);
}
reverse(need_op[i].begin(), need_op[i].end());
}
vector<ll> imos(LIMIT, 0LL);
for (int i = 0; i < N; i++) {
for (int j = 0; j < need_op[i].size() - 1; j++) {
int curr = need_op[i][j].first, to = need_op[i][j + 1].first;
ll val = need_op[i][j + 1].second;
imos[curr] += val;
imos[to] -= val;
}
imos[need_op[i][need_op[i].size() - 1].first] += INF;
}
for (int i = 0; i < LIMIT - 1; i++) {
imos[i + 1] += imos[i];
if (imos[i + 1] > K) {
cout << i + 1 << "\n";
return;
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
solve();
return 0;
}