把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; }
原文地址:https://www.cnblogs.com/JYYHH/p/9097149.html
时间: 2024-11-09 03:42:15