/ SeriousOJ /

Record Detail

Accepted


  
# Status Time Cost Memory Cost
#1 Accepted 1ms 416.0 KiB
#2 Accepted 3ms 788.0 KiB
#3 Accepted 4ms 448.0 KiB
#4 Accepted 9ms 788.0 KiB
#5 Accepted 9ms 820.0 KiB
#6 Accepted 9ms 788.0 KiB
#7 Accepted 10ms 788.0 KiB
#8 Accepted 9ms 864.0 KiB
#9 Accepted 8ms 792.0 KiB
#10 Accepted 3ms 788.0 KiB
#11 Accepted 3ms 832.0 KiB
#12 Accepted 3ms 836.0 KiB
#13 Accepted 3ms 792.0 KiB
#14 Accepted 2ms 532.0 KiB
#15 Accepted 7ms 788.0 KiB
#16 Accepted 9ms 908.0 KiB
#17 Accepted 44ms 1.129 MiB
#18 Accepted 7ms 1.07 MiB
#19 Accepted 15ms 1.098 MiB
#20 Accepted 17ms 1.273 MiB
#21 Accepted 16ms 1.207 MiB
#22 Accepted 17ms 1.27 MiB
#23 Accepted 17ms 1.395 MiB
#24 Accepted 17ms 1.496 MiB
#25 Accepted 15ms 1.406 MiB
#26 Accepted 18ms 1.547 MiB
#27 Accepted 21ms 1.363 MiB
#28 Accepted 18ms 1.371 MiB
#29 Accepted 16ms 1.379 MiB
#30 Accepted 20ms 1.676 MiB
#31 Accepted 21ms 1.566 MiB
#32 Accepted 13ms 1.27 MiB
#33 Accepted 11ms 1.582 MiB
#34 Accepted 9ms 1.02 MiB
#35 Accepted 38ms 1.684 MiB

Code

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int T;
    cin >> T;
    while(T--){
        int N;
        cin >> N;
        vector<int> A(N);
        int maxA = 0;
        for(int i = 0; i < N; i++){
            cin >> A[i];
            maxA = max(maxA, A[i]);
        }

        int kodd = (N + 1) / 2;
        int keven = N / 2;

        vector<int> freq(maxA+1, 0);
        for(int x : A) freq[x]++;

        // cnt[d] = number of elements divisible by d
        vector<int> cnt(maxA+1, 0);
        for(int d = 1; d <= maxA; d++){
            for(int m = d; m <= maxA; m += d)
                cnt[d] += freq[m];
        }

        // collect candidates
        vector<int> Xs, Ys;
        for(int d = 1; d <= maxA; d++){
            if(cnt[d] >= kodd)  Xs.push_back(d);
            if(cnt[d] >= keven) Ys.push_back(d);
        }

        ll best = 0;
        for(int X : Xs){
            for(int Y : Ys){
                ll L = lcm<ll>(X, Y);
                int inter = (L <= maxA ? cnt[L] : 0);
                int covered = cnt[X] + cnt[Y] - inter;
                if(covered == N){
                    best = max(best, (ll)X + Y);
                }
            }
        }
        cout << best << '\n';
    }
    return 0;
}

Information

Submit By
Type
Submission
Problem
P1077 Even Odd GCD (Hard Version)
Language
C++17 (G++ 13.2.0)
Submit At
2025-05-24 10:26:13
Judged At
2025-05-24 10:26:13
Judged By
Score
100
Total Time
44ms
Peak Memory
1.684 MiB