很好想的一个思路,就是对于可选的数对bi,bj,连一条边
但是枚举所有可选的数对,T了
咋办???
bi+bj+gcd(bi,bj)=lcm(bi,bj)
找一找规律:
x+y+gcd=lcm
令x<=y
当x=y,3x!=x
当x<y,
lcm%y=0,(x+y+gcd)%y=0
而 x<x+gcd<2x,x<y
易知 x+gcd=y
又因为gcd=x* y/lcm
解得:结论 y=3/2 *x
推论:对于偶数x,其对应的y只有一个;而奇数x,无对应的y
map查找x有无对应的y即可
以下展示无敌的map
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10;
long long a[N];
map<long long,int>m;
int main() {
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
m[a[i]]++;
}
sort(a+1,a+n+1);
long long ans=-1e9;
for(int i=1;i<=n;i++){
long long t=a[i],sum=0;
while(m[t]){
sum+=t*m[t];
m[t]=0;
if(t%2)break;
else t=t/2*3;
}
ans=max(ans,sum);
}
cout<<ans;
return 0;
}