Neko does Maths

tech2024-10-18  17

解题报告: lcm(a+k,b+k)= (a+k)(b+k)/gcd(a+k,b+k) ,gcd(a+k,b+k) = gcd(b+k,a-b). 无论k怎么变 a-b就是定值,我们暴力枚举a-b的因子,假设该因子是两个数的最大公约数,因为b+k能被枚举的d所整除,可以求出来k的值,记录最小值就行了。

#include<iostream> #include<cstring> #include<vector> #include<algorithm> using namespace std; typedef long long ll; const int N=200010; const int mod=10007; int n,m; vector<int>Q; int main() { int a,b; cin>>a>>b; int k; int resk=0; if(a>b) swap(a,b); int del = b - a; ll res=2e18; for(int i=1;(ll)i*i<=(b-a);i++) { if((b-a)%i == 0) { int c = (b-a)/i; int d = i ; Q.push_back(c); if(c!=d) Q.push_back(d); } } for(int i=0;i<Q.size();i++) { if(b%Q[i]) k = (ll)Q[i]*(b/Q[i]+1) - b; else k = 0; ll tt=(ll)(a+k)*(b+k)/Q[i]; if(tt<res) { res=tt; resk=k; } } cout<<resk<<endl; }
最新回复(0)