The 2023 ICPC Asia Hong Kong Regional Programming Contest (The 1st Universal Cup, Stage 2:Hong Kong)

K .Maximum GCD

首先想到a[1],其他%后成为a[1],但是【一个数取模后可能得到的数为[0,\(\lceil\frac{x}{2}\rceil\)-1]】不一定能得到a[1]
否则的话,构造a[1]偶数,a[1]不动,其他必然能够取模得到a[1]/2,否则要是a[1]/2>(x+1)/2-1 a[1]>x矛盾
a[1]为奇数,就构造(a[1]+1)/2-1

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define yes cout << "Yes" << endl
#define no cout << "No" << endl
#define pii pair<int,int>
#define ll long long
#define int long long
#define pb push_back

int a[100010];

void solve(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
   sort(a+1,a+n+1);
   if(a[1]==a[n]){
    cout<<a[1]<<'\n';
    return ;
   }
   int g=a[1];for(int i=1;i<=n;i++)g=gcd(g,a[i]);
   
   
   int st=1;while(st<=n&&a[st]==a[1])st++;
   bool f=1;
   for(int i=st;i<=n;i++){
    if(a[1]>(a[st]+1)/2-1){f=0;break;}
   }
   if(f){
    cout<<max(g,a[1])<<'\n';return ;
   }
   
   //否则偶数可以a[1]/2
   //a[1]不动,其他%得到a[1]/2
   //否则奇数可以a[1]/2=(a[1]+1)/2-1
   
   cout<<max(g,a[1]/2)<<'\n';
}
signed main(){
    std::ios::sync_with_stdio(false);
    int T;T=1;
    while(T--){
        solve();
    }
}
posted @ 2025-09-02 16:09  arin876  阅读(21)  评论(0)    收藏  举报