刚开始做这个题的时候也是不清楚样例
但是数学公式来的
假设 y>x (y 是 bj,x 是 bi)
x+y+gcd(x,y)= lcm(x,y)
另 gcd = d,且知道 lcm=x*y/d
x/d+y/d+1=(x/d) * (y/d)
所以 (x/d-1)*(y/d-1) = 2
所以 可以得到 y/d=3, x/d=2
即 3x=2y
根据上述推导 ,代码就出来了,对于每一个确定的 y ,去寻找数列中是否有对应的那个 x,之后此 x 变为 y,重复上述操作
这样有个问题:
1.对于每个 y 我们都要遍历一遍数组 ,时间复杂度为 O(n^2) ,所以我们可以用 map 来简化时间
以下代码是假设存在 x ,去寻找对应的 y 值,然后将 y 作为 x 的值,重复操作
const int N=3e5+5; int n,m,t; int i,j,k; ll a[N]; int main() { //IOS; while(~sd(n)){ map<ll,int> mp; for(i=1;i<=n;i++) sll(a[i]),mp[a[i]]++; sort(a+1,a+1+n); ll ans=0,sum,tmp; for(i=1;i<=n;i++){ sum=0,tmp=a[i]; while(mp[tmp]){ sum+=tmp*mp[tmp]; //mp[tmp]=0; if(tmp%2!=0) break; tmp=tmp/2*3; } if(sum>ans) ans=sum; } pll(ans); } //PAUSE; return 0; }
