题目出自 51nod

题目描述

任给两个正整数 N、M,求一个最小的正整数 a(a < M),使得 a 和 (M - a)都是 N 的因子。

输入描述

包括两个整数 N、M。N 不超过 10^9。

输出描述

输出一个整数 a,表示结果。如果某个案例中满足条件的正整数不存在,则在对应行输出 -1。

样例

输入
35 10
输出
5

算法

(暴力枚举 + 优化)

先暴力,TLE

    for(int i = 1; i <= m && i <= n; i++)
	{
		if(n % i == 0 && n % (m - i) == 0)
		{
			cout << i << endl;
			return 0;
		}
	}
    cout << res << endl;

优化1 i * i <= n WA了 说明答案是有可能大于 根号n 的

	for(int i = 1; i <= m && i * i <= n; i++)
	{
		if(n % i == 0 && n % (m - i) == 0)
		{
			cout << i << endl;
			return 0;
		}
	}
	cout << res << endl;

优化2 在for循环中加入

        int k = n / i;
		if(k < m && n % k == 0 && n % (m - k) == 0) res = k;

AC了

	for(int i = 1; i <= m && i * i <= n; i++)
	{
		if(n % i == 0 && n % (m - i) == 0)
		{
			cout << i << endl;
			return 0;
		}

		int k = n / i;
		if(k < m && n % k == 0 && n % (m - k) == 0) res = k;
	}
	cout << res << endl;

优化3 for循环条件改为 i <= m / 2 && i * i <= n 代码如下

C++ 代码

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;

int main()
{
	int n, m;
	cin >> n >> m;

	int res = -1;
	for(int i = 1; i <= m / 2 && i * i <= n; i++)
	{
		if(n % i == 0 && n % (m - i) == 0)
		{
			cout << i << endl;
			return 0;
		}

		int k = n / i;
		if(k < m && n % k == 0 && n % (m - k) == 0) res = k;
	}
	cout << res << endl;

	return 0;
}