voidKruskal(){ sort(edge.begin(),edge.end()); int cnt = 0; ll ans = 0; for (auto e : edge) { int x = e.l,y = e.r;ll w = e.w; if (find(x) != find(y)) { //printf("%d %d %lld\n",x,y,w); f[max(find(x),find(y))] = min(find(x),find(y)); ans += w; } } printf("%lld\n",ans); }
signedmain(){ read(l,r); ll ans = 0; for (int i = l;i <= r;++i) f[i] = i,buc[i] = 1; for (int i = 2;i <= r;++i) { //if (vis[i]) continue; int cnt = 0,fis = 0; for (int j = i;j <= r;j += i) { if (buc[j] && !fis) fis = j; if (buc[j]) edge.push_back((node){fis,j,lcm(fis,j)}); vis[j] = 1; }
if (i >= l) edge.push_back((node){fis,l,lcm(fis,l)}); } Kruskal(); return0; }