[ABC296D] M<=ab 题解
lottle1212 · · 题解
[ABC296D] M<=ab
Part0:
首先解读一下题目:
-
给出两个整数
N 和M (1 \leq N, M \leq 10 ^ {12}) 。 -
找出两个整数
a 和b (1 \leq a, b \leq N) 的积,使得a \times b \geq M (a, b 可以相同),求出其中最小的积。
输入:
5 7
输出:
8
在此样例中,
Part1:
由于所求的 a <= n && b <= n,则此对
AC Code:
#include<bits/stdc++.h>
using namespace std;
long long n, m, ans = 1e18, i, j;
signed main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> m;
for(i = 1; i * i <= m; ++ i) {//枚举i
j = m / i + (m % i != 0);//求出最小的j
if(i <= n && j <= n) ans = min(ans, i * j);//若i,j满足均条件,更新答案
}
cout << (ans == 1e18 ? -1 : ans);//若答案未被更新,输出-1;否则输出求得的最小值
return 0;
}
- 注:
i,j 即a,b 。
Part2:
提交以上代码,你就会发现 WA on #16。请看此样例:
输入:
4 15
输出:
16
而原来的代码就会输出:
-1
在此样例中,华丽地输出了 -1。
解决此问题也十分容易。由于原来的代码在枚举 for 循环中的 m 改成 m * 2,即可轻松通过此题。
真正的 AC Code:
#include<bits/stdc++.h>
using namespace std;
long long n, m, ans = 1e18, i, j;
signed main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> m;
for(i = 1; i * i <= m * 2; ++ i) {//注意此处要乘2
j = m / i + (m % i != 0);
if(i <= n && j <= n) ans = min(ans, i * j);
}
cout << (ans == 1e18 ? -1 : ans);
return 0;
}