Official

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: