某考试 T1 lcm

    把lcm写成 (a+n)*(b+n) / gcd(a+n,b+n).

    因为gcd可以辗转相减,所以就成了gcd(abs(a-b),a+n),一个常量一个变量之间的gcd,我们可以直接把abs(a-b)的所有约数找出来,然后看a要有某个约数的话n至少是多少,更新答案即可。(因为1e9以下的数的最多的约数的级别是1e3)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<ctime>
#define ll long long
using namespace std;

int A,B,C,N,d[2333],num;
ll ans=1ll<<62ll,w;

//int gcd(int x,int y){ return y?gcd(y,x%y):x;}

inline void solve(){
	C=A-B;
	for(int i=1;i*(ll)i<=C;i++) if(!(C%i)){
		d[++num]=i;
		if(i*(ll)i!=C) d[++num]=C/i;
	}
//	sort(d+1,d+num+1);
	
	for(int i=1,now;i<=num;i++){
		now=d[i]-A%d[i];
		
		w=(A+now)*(ll)(B+now)/d[i];
		if(w<ans||(w==ans&&now<N)) N=now,ans=w;
	}
}

int main(){
	freopen("lcm.in","r",stdin);
	freopen("lcm.out","w",stdout);
	
	scanf("%d%d",&A,&B);
	if(A<B) swap(A,B);
	if(A==B){ puts("1"); return 0;}
	
	solve();
	
	cout<<N<<endl;
	return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/JYYHH/p/9097149.html
lcm
t1