给你两个数n和k,让你找到一个最小的i,满足 (i/k) * (i%k) == n
Input
The first line contains two integers n and k (n<=1e6 k <= 1e4)
Output
输出满足条件的最小的i
Examples
Input
6 3
Output
11
Input
1 2
Output
3
Input
4 6
Output
10
Note
第一个样例 11/3 = 3 , 11%3 = 2, 3 * 2 = 6 (注意,除法是整数,没有小数)
解题思路:这题选择枚举法 但能够枚举的数据有两个 i / k 和 i % k; 我们看看n的取值范围 n <= 1e6 ; 如果要枚举i / k 那么i的数据范围就是(i / 1e4) * (i % 1e4) == 1e6 , i的取值能达到1e9; 所以我们考虑去枚举(i % k)这样最大的数据范围也就是1 ~ k-1;这样的枚举是可行的 那么满足什么条件时能得到i? 如果要满足(i / k) * (i % k) == n; 那么(i % k)一定是n的一个因子 所以n / (i % k) 能得到x(i / k), 那么x(i / k) + (i % k)就是一个值 但不一定是最小值 那如何让i最小? 我们已经得到公式了 只需要将(i % k)的值最大 那么x(i / k) 就最小 那么他们的和就最小
#include <cstdio>
using namespace std;
int main()
{
int n, k;
scanf("%d %d", &n, &k);
for (int i = k - 1; i > 0; i--)//枚举余数
{
if (n % i == 0)
{
printf("%d", (n / i) * k + i);
break;
}
}
return 0;
}