結果
| 問題 | No.3461 Min GCD |
| コンテスト | |
| ユーザー |
くらげ
|
| 提出日時 | 2026-02-27 11:35:05 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,600 bytes |
| 記録 | |
| コンパイル時間 | 4,075 ms |
| コンパイル使用メモリ | 355,076 KB |
| 実行使用メモリ | 49,148 KB |
| 最終ジャッジ日時 | 2026-02-28 13:14:17 |
| 合計ジャッジ時間 | 13,063 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 20 TLE * 1 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using P = pair<ll,ll>;
#define rep(i,n) for(int (i) = 0; i<(n); i++)
const int N = 100000;
const ll inf = 1e18;
int main(){
int n; ll k;
cin >> n >> k;
vector<ll> a(n), b(n);
rep(i,n) cin >> a[i];
rep(i,n) cin >> b[i];
// div[i] : i の約数
vector<vector<int>> div(N+10);
for(int i=1; i<=N+5; i++){
int j = i;
while(j<=N+5){
div[j].push_back(i);
j += i;
}
}
// gcd(a[i], b[i]) を div の値にするのに必要な操作回数
vector<vector<P>> min_op(n);
rep(i,n){
ll min_cost = inf;
for(int j = div[a[i]].size()-1; 0<=j; j--){
ll p = div[a[i]][j];
ll cost = (b[i]%p==0? 0 : p-b[i]%p);
if(cost<min_cost){
min_op[i].push_back(P(p, cost));
min_cost = cost;
}
}
sort(min_op[i].begin(), min_op[i].end());
}
priority_queue<P, vector<P>, greater<P>> q;
rep(i,n) q.push(P(min_op[i][0].first, i));
while(q.size()){
auto [g, i] = q.top();
if(g==a[i]) break;
q.pop();
ll c1 = (*lower_bound(min_op[i].begin(), min_op[i].end(), P(g, 0))).second;
auto [g2, c2] = *upper_bound(min_op[i].begin(), min_op[i].end(), P(g, inf));
if(0<=k+c1-c2){
k = k+c1-c2;
q.push(P(g2, i));
}
else{
q.push(P(g, i));
break;
}
}
cout << min(q.top().first, *min_element(a.begin(), a.end())) << endl;
}
くらげ