luogu P6786 「SWTR-6」GCDs & LCMs
题面传送门
月赛中的简单题。
考虑推一波式子。
设\(g=gcd(b_i,b_j)\)
那么原式就是\(b_i+b_j+g=\frac{b_i\times b_j}{g}\)
\(\frac{b_i}{g}+\frac{b_j}{g}+1=\frac{b_i}{g}\times \frac{b_j}{g}\)
换元,设\(x=\frac{b_i}{g},y=\frac{b_j}{g}\)
那么\(a+b+1=ab\)
\((a-1)(b-1)=2\)
根据题意又有\(b_i<b_j\),所以\(b_i\times 1.5=b_j\)
那么建图跑最长链即可。
注意相同也要连边
代码实现:
#include<cstdio>
#include<map>
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
int n,m,k,x,y,z,a[300039],p[300039],in[300039],now;
long long ans,tot;
map<int,int>q,f;
struct yyy{int to,w,z;};
int main(){
register int i;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&a[i]);tot=max(tot,a[i]);
if(q[a[i]]) p[q[a[i]]]=i,in[i]++;
q[a[i]]=i;
if(!f[a[i]])f[a[i]]=i;
}
for(i=1;i<=n;i++){
if(a[i]%2==0&&f[a[i]/2*3]&&!p[i]) p[i]=f[a[i]/2*3],in[p[i]]++;
}
for(i=1;i<=n;i++){
if(!in[i]&&p[i]){
ans=a[i];
now=p[i];
while(now){
ans+=a[now];
now=p[now];
}
tot=max(tot,ans);
}
}
printf("%lld\n",tot);
}

浙公网安备 33010602011771号