D - M<=ab Editorial by mechanicalpenciI
\(X\) が \(2\) つの \(1\) 以上 \(N\) 以下の整数 \(a,b\) の積で表されるという条件について、 \(a\leq b\) であるという要請を加えても条件をみらす整数の集合は変わらず、したがって、答えも変わりません。 以下、この要請を加えた上で問題を考えます。
答えとなる \(X\) を \(1\) 以上 \(N\) 以下の整数 \(a,b\) \((a\leq b)\) の積で表した時の、\(a\) の候補としてあり得るものを考えたとき、\(a>\lceil \sqrt M\rceil\) であるようなものについては考える必要はありません。
なぜなら、\(\lceil \sqrt M\rceil<a\leq b\) より、\(M\leq \lceil \sqrt M\rceil^2<ab\) となり、このような \(2\) 数の積が答えとなる事はないからです。
次に、\(a\) を固定した時の \(b\) の値について考えます。
\(M\leq ab\) という条件から、 \(b\geq \frac{M}{a}\) が必要となります。
ここで、\(\frac{M}{a}>N\) ならば、その \(a\) に対応する条件をみたす \(b\) は存在しません。
逆に、\(\frac{M}{a}\leq N\) の時、 \(N\) が整数である事から \(\left\lceil \frac{M}{a} \right\rceil\leq N\) であり、
少なくとも \(b=\left\lceil \frac{M}{a} \right\rceil\) とした時の \(a,b\) は条件をみたします。
さらに、\(a(>0)\) を固定した時、\(ab\) は \(b\) について単調増加である事から、\(b>\left\lceil \frac{M}{a} \right\rceil\) ならば
\(M\leq a\cdot \left\lceil \frac{M}{a} \right\rceil<ab\) であることから、これも答えとなり得ません。
よって、答えと
なる \(X\) の候補は \(1\leq a\leq \lceil \sqrt{M}\rceil\) について、 \(b=\left\lceil \frac{M}{a} \right\rceil\) とした時の \(ab\) の値となります。
計算量について、各 \(a\) に対する値は \(O(1)\) で計算できるため全体で \(O(\sqrt{M})\) であり、
\(M\leq 10^{12}\) より十分高速です。
よって、この問題を解く事ができました。
c++による実装例 :
#include <bits/stdc++.h>
using namespace std;
#define INF (long long)2e+18
int main() {
long long n,m,x,ans=INF;
cin>>n>>m;
for(long long i=1;i<=n;i++){
x=(m+i-1)/i;
if(x<=n)ans=min(ans,i*x);
if(i>x)break;
}
if(ans==INF)cout<<-1<<endl;
else cout<<ans<<endl;
return 0;
}
posted:
last update: