/ SeriousOJ /

Record Detail

Wrong Answer


  
# Status Time Cost Memory Cost
#1 Accepted 1ms 540.0 KiB
#2 Wrong Answer 1ms 540.0 KiB
#3 Wrong Answer 1ms 540.0 KiB
#4 Wrong Answer 1ms 540.0 KiB
#5 Wrong Answer 2ms 540.0 KiB
#6 Wrong Answer 1ms 540.0 KiB
#7 Accepted 1ms 540.0 KiB
#8 Wrong Answer 2ms 540.0 KiB
#9 Accepted 1ms 440.0 KiB
#10 Accepted 1ms 540.0 KiB
#11 Wrong Answer 1ms 540.0 KiB
#12 Wrong Answer 1ms 540.0 KiB
#13 Accepted 1ms 540.0 KiB
#14 Wrong Answer 2ms 464.0 KiB
#15 Accepted 12ms 1.004 MiB
#16 Wrong Answer 14ms 824.0 KiB
#17 Wrong Answer 79ms 1.641 MiB
#18 Wrong Answer 4ms 588.0 KiB
#19 Accepted 50ms 944.0 KiB
#20 Wrong Answer 62ms 1.191 MiB
#21 Wrong Answer 52ms 1.164 MiB
#22 Wrong Answer 53ms 960.0 KiB
#23 Wrong Answer 61ms 1.008 MiB
#24 Wrong Answer 118ms 1000.0 KiB
#25 Accepted 36ms 1012.0 KiB
#26 Wrong Answer 66ms 1012.0 KiB
#27 Accepted 363ms 1.043 MiB
#28 Wrong Answer 38ms 1.027 MiB
#29 Accepted 315ms 1.0 MiB
#30 Wrong Answer 1992ms 2.289 MiB
#31 Accepted 785ms 2.273 MiB
#32 Wrong Answer 17ms 784.0 KiB
#33 Wrong Answer 12ms 1.648 MiB
#34 Wrong Answer 9ms 1.023 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 ;
   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] ;
    for(auto &x : a) cin >> x ;
    sort(a , a + n) ;
    vector < int > div = findDivisors(a[0]);
    ll Ans = 0 , pos = -1;
    for(auto cur : div){
        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 00:36:11
Judged At
2024-08-10 00:36:11
Judged By
Score
31
Total Time
1992ms
Peak Memory
2.289 MiB