P6786 「SWTR-6」GCDs & LCMs(数学推导)

it2026-09-23  17

 

 刚开始做这个题的时候也是不清楚样例

但是数学公式来的

假设 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; }

 

最新回复(0)