100818 D 解题报告
题意:
给你a和b
求最小的N(N>0),使得lcm(a+N,b+N)最小
解法很神奇啊
只要求N的所有约数即可
#include<set> #include<map> #include<list> #include<queue> #include<stack> #include<string> #include<time.h> #include<math.h> #include<memory> #include<vector> #include<bitset> #include<fstream> #include<stdio.h> #include<utility> #include<sstream> #include<string.h> #include<iostream> #include<stdlib.h> #include<algorithm> using namespace std; long long ans=1999999999999999999ll; int val; int a,b; void check_ans(int n) { long long t=(long long)n*(a/n+1)*(b/n+1); if (t<ans) val=n-a%n; if ((t==ans)&&(n<val)) val=n-a%n; if (t<ans) ans=t; } int main() { scanf("%d%d",&a,&b); if (a<b) swap(a,b); int n=a-b; int i; if (n==0) { cout<<1<<endl; return 0; } for (i=1;i*i<=n;i++) { if (n%i==0) { check_ans(i); check_ans(n/i); } } cout<<val<<endl; return 0; }