最大化k*g
小w最近仔细研究了公约数,他想到了以下问题:
现有n个正整数,从中选k(2≤k≤n)个,设这k个数的最大公约数为g,则这k个数的价值为k∗g。求这个价值的最大值。
小w当然知道答案了。现在他想考考你,你能很快回答出来吗?
Input
第一行,一个整数nn。
第二行,nn个正整数。
Output
一行一个正整数,表示答案。
Samples
Hint
【数据范围】
- 对于30%数据,N≤100
- 对于100%数据,N≤200000,输入第二行每个数字不超过2000000
Source
石光中学 2018泉州集训提高组day5
解析:这个题两个变量,可以先固定一个变量,就是先把每个数的因子处理出来;
但是要加读入挂,
#pragma GCC optimize(1) #pragma GCC optimize(2) #pragma GCC optimize(3,"Ofast","inline") #include<iostream> #include<algorithm> /* 现有n个正整数,从中选k(2≤k≤n)个, 设这k个数的最大公约数为g,则这k个数的价值为k*g。求这个价值的最大值。 */ using namespace std; typedef long long ll; const int maxn=5e6+100; struct ios { inline char gc(){ static const int IN_LEN=1<<18|1; static char buf[IN_LEN],*s,*t; return (s==t)&&(t=(s=buf)+fread(buf,1,IN_LEN,stdin)),s==t?-1:*s++; } template <typename _Tp> inline ios & operator >> (_Tp&x){ static char ch,sgn; ch = gc(), sgn = 0; for(;!isdigit(ch);ch=gc()){if(ch==-1)return *this;sgn|=ch=='-';} for(x=0;isdigit(ch);ch=gc())x=x*10+(ch^'0'); sgn&&(x=-x); return *this; } }io; template <class T> inline void out(T x) { if (x > 9) { out(x / 10); } putchar(x % 10 + '0'); } int a[maxn]; int n; int vis[maxn]; ll max(ll a,ll b){ if(a>b){ return a; } else{ return b; } } int main(){ io>>n; for(register int i=1;i<=n;i++){ io>>a[i]; } sort(a+1,a+n+1); for(register int i=1;i<=n;i++){ for(register int j=1;j*j<=a[i];j++){ if(a[i]%j==0){ vis[j]++; if(j*j!=a[i]){ vis[a[i]/j]++; } } } } int p=a[n]; ll ans=0; for(register int i=1;i<=p;i++){ if(vis[i]>1){//如果是1的话,就是一个数,要两个以上的数才行 ans=max(ans,1ll*i*vis[i]); } } out(ans); }