Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- int main(){
- int n;
- cin>>n;
- vector<vector<long long> >a(n+1);
- vector<long long> A(n+1),B(n+1);
- for(int i=1;i<=n;i++){
- cin>>A[i];
- }
- for(int i=1;i<=n;i++){
- cin>>B[i];
- }
- for(int i=1;i<=n;i++){
- for(int j=1;j<=n;j++){
- a[i].push_back(__gcd(A[i],B[j]));
- }
- sort(a[i].begin(),a[i].end());
- }
- vector<long long> u (n+1), v (n+1), p (n+1), way (n+1);
- for (int i=1; i<=n; ++i) {
- p[0] = i;
- int j0 = 0;
- vector<long long> minv (n+1,10000);
- vector<char> used (n+1, false);
- do {
- used[j0] = true;
- long long i0 = p[j0], delta = 10000, j1=0;
- for (int j=1; j<=n; ++j)
- if (!used[j]) {
- int cur = a[i0][j]-u[i0]-v[j];
- if (cur < minv[j])
- minv[j] = cur, way[j] = j0;
- if (minv[j] < delta)
- delta = minv[j], j1 = j;
- }
- for (int j=0; j<=n; ++j)
- if (used[j])
- u[p[j]] += delta, v[j] -= delta;
- else
- minv[j] -= delta;
- j0 = j1;
- } while (p[j0] != 0);
- do {
- int j1 = way[j0];
- p[j0] = p[j1];
- j0 = j1;
- } while (j0);
- }
- long long cost = -v[0];
- cout<<cost;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement