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();
}
}

浙公网安备 33010602011771号