/ SeriousOJ /

Record Detail

Time Exceeded


  
# Status Time Cost Memory Cost
#1 Accepted 1ms 540.0 KiB
#2 Accepted 2ms 540.0 KiB
#3 Accepted 1ms 540.0 KiB
#4 Accepted 1ms 540.0 KiB
#5 Accepted 2ms 492.0 KiB
#6 Accepted 2ms 540.0 KiB
#7 Accepted 2ms 332.0 KiB
#8 Accepted 2ms 540.0 KiB
#9 Accepted 2ms 516.0 KiB
#10 Accepted 2ms 572.0 KiB
#11 Accepted 2ms 332.0 KiB
#12 Wrong Answer 3ms 416.0 KiB
#13 Accepted 6ms 540.0 KiB
#14 Accepted 2ms 540.0 KiB
#15 Time Exceeded ≥2096ms ≥2.273 MiB
#16 Time Exceeded ≥2092ms ≥2.309 MiB
#17 Time Exceeded ≥2099ms ≥4.145 MiB
#18 Accepted 11ms 768.0 KiB
#19 Accepted 386ms 976.0 KiB
#20 Wrong Answer 376ms 1.27 MiB
#21 Wrong Answer 320ms 1.016 MiB
#22 Wrong Answer 334ms 1.051 MiB
#23 Wrong Answer 516ms 1.199 MiB
#24 Wrong Answer 762ms 1.258 MiB
#25 Accepted 307ms 1.066 MiB
#26 Wrong Answer 545ms 1.203 MiB
#27 Accepted 1586ms 1.199 MiB
#28 Accepted 819ms 1.082 MiB
#29 Time Exceeded ≥2097ms ≥1.203 MiB
#30 Time Exceeded ≥2098ms ≥2.25 MiB
#31 Time Exceeded ≥2097ms ≥2.164 MiB
#32 Accepted 342ms 944.0 KiB
#33 Time Exceeded ≥2100ms ≥7.207 MiB
#34 Accepted 41ms 872.0 KiB
#35 Time Exceeded ≥2100ms ≥2.395 MiB

Code

#include <bits/stdc++.h>
using namespace std;
#define SC               scanf
#define PF               printf
#define ull              unsigned long long
#define ld               long double
#define F                first
#define S                second
#define pb               push_back
#define sort_a(a)        sort(a.begin(),a.end());
#define sort_d(a)        sort(a.rbegin(),a.rend());
#define READ(f)          freopen(f, "r", stdin)
#define WRITE(f)         freopen(f, "w", stdout)
#define rev(s)           reverse(s.begin(),s.end())
#define P(ok)            cout << (ok ? "YES\n": "NO\n")
#define __Heart__              ios_base :: sync_with_stdio(false); cin.tie(NULL);
#define ll long long
typedef pair< ll , ll>                   PII;

int gcd(int a, int b)
{
    if (a == b) return a;
    if (a == 0) return b;
    if (b == 0) return a;

    if (~a & 1)
    {
        if (b & 1) return gcd(a >> 1, b);
        else return gcd(a >> 1, b >> 1) << 1;
    }

    if (~b & 1) return gcd(a, b >> 1);
    if (a > b) return gcd((a - b) >> 1, b);
    return gcd((b - a) >> 1, a);
}

vector<int> findDivisors(int n) {
    vector<int> div;
    for (int i = 1; i <= sqrt(n); ++i) {
        if (n % i == 0) {
            div.pb(i);
            if (i != n / i) div.pb(n / i);
        }
    }
    return div;
}

ll calc1(vector < int > even , vector < int > odd , vector < int > div , int n){
     int half = n / 2 ;
     ll Ans = 2LL ;
     for(auto it : div){
            int cnt = 0 ;
        for(auto kt : odd) if(kt % it == 0) cnt++ ;
         if(cnt >= half) Ans = max(Ans , (ll) it + 1) ;
            for(auto i : even) if(i % it == 0) cnt++ ;
         if(cnt == n) Ans = max(Ans , (ll) it + it) ;
     }
     return Ans ;

}

ll calc2(vector < int > even , vector < int > div , int pos ){

   ll val = div[pos] , half = even.size() / 2 ;
   ll Ans = val + val ;
   //cout << pos << endl ;
   for(int i = pos + 1 ; i < div.size() ; i++){
        ll cur = div[i] , cnt = 0 ;
        for(auto it : even){
            if(it % cur == 0) cnt++ ;
        }
        if(cnt >= half) Ans = max(Ans , val + cur)  ;
   }
   return Ans ;
}

ll calc3(vector < int > even , vector < int > odd , vector < int > div ,  int val){
     ll Ans = val + 1 ;
      for(auto it : div){
        int cnt = 0 , half = even.size() / 2;
        for(auto kt : odd) if(kt % it == 0) cnt++ ;
        if(cnt == odd.size()){
            for(auto i : even) if(i % it == 0) cnt++ ;
            if(cnt >= half){
                Ans = max(Ans , (ll)it + val) ;
            }
        }
      }

    return Ans ;

}

void solve()
{
    int n ; cin >> n ; int a[n] ;
    set < int > st ;
    vector < int > div ;
    for(auto &x : a){
        cin >> x ;
        div = findDivisors(x) ;
        for(auto it : div) st.insert(it) ;
    }
    sort(a , a + n) ;
    div =  findDivisors(a[0]);
    ll Ans = 0 , pos = -1;
    for(auto cur : st){
        pos++ ;
        vector < int > even , odd ;
        for(int i = 0 ; i < n ; i++){
            if(a[i] % cur == 0){
               even.pb(a[i]) ;
            }
            else odd.pb(a[i]);
        }
        vector < int > div2 ;
        if(odd.size()) div2 = findDivisors(odd[0]) ;
        int half = n / 2 ;
        if(even.size() < half) {
            Ans = max(Ans , calc1(even , odd , div2 , n)) ;
            //cout <<" first con " << cur << " " << Ans << endl ;
        }
        else if (even.size() == half) {
            ll gc = odd[0] ;
            for(int i = 1 ; i < odd.size() ; i++) gc = gcd(gc , odd[i]) ;
            gc += cur ;
            Ans = max(Ans , gc) ;
            //cout <<" Sec con " << cur << " " << Ans << endl ;
        }
        else if(even.size() == n ) {
            Ans = max(Ans , calc2(even , div , pos)) ;
           //  cout <<" third con " << cur << " " << Ans << endl ;
        }
        else {
            Ans = max(Ans , calc3(even , odd , div2 , cur)) ;
             //cout <<" last con "  << cur << " " << Ans << endl ;
        }

    }
    cout << Ans << "\n" ;

}
int main()
{
     __Heart__
     int t ; cin >> t ; while(t--) solve() ;
}

Information

Submit By
Type
Submission
Problem
P1077 Even Odd GCD (Hard Version)
Language
C++20 (G++ 13.2.0)
Submit At
2024-08-10 23:59:39
Judged At
2024-08-10 23:59:39
Judged By
Score
56
Total Time
≥2100ms
Peak Memory
≥7.207 MiB