Я верю в простую математику.
Указанные вами подсказки были очень важны.
Случай 1:
Если N четное = > A = N / 2, B = N / 2
Случай 2:
Если N простое число => A = 1, B = N-1;
Случай 3:
Если N нечетное => Это сложно.
Теперь, если A + B = N
, максимальное возможное значение A (учитывая A <= B) равно <code>N/2.
Кроме того, чтобы минимизировать НОК A и B, LCM(A, B) = max(A, B) = B
.... eq (1)
A + B = N .... eq (2)
B = d * A, где d - любое положительное целое число (из уравнения (1)) .... eq (3)
Подставляя уравнение (3) в уравнение (2), мы получаем,
A + d * A = N
A (1 + d) = N
A = N / (d + 1) .... eq (4)
Теперь цель состоит в том, чтобы минимизировать LCM =>, который, в свою очередь, должен минимизировать max (A, B) = B
Если мы хотим минимизировать B, нам нужно максимизировать A (из уравнения (4))
Чтобы максимизировать A, нам нужно минимизировать (d + 1).
Следовательно, (d+1) = D = smallest factor of N
, где (D)> = 3 и d = D-1.
Окончательный ответ, A = N / (d + 1) и B = d * A
Взгляните на следующую реализацию, которая имеет Принято приговор по Codeforces:
#include <iostream>
#include <string>
#include <cmath>
typedef long long int LL;
bool isPrime(LL n)
{
for(LL i = 2 ; i <= sqrt(n) ; i++ )
if(n%i==0)return false;
return true;
}
int main()
{
int t;
std::cin >> t;
while(t--){
LL n, A, B;
std::cin>>n;
if( n % 2LL == 0 ) {
A = n/2LL ;
B = n/2LL ;
}
else if(isPrime(n)) {
A = 1LL ;
B = n-1LL ;
}
else{
LL D;
for(LL i = 3; i <= sqrt(n) ; i++ )
{
if( n % i == 0) {
D = i;
break;
}
}
LL d = D - 1LL;
A = n/(d+1LL);
B = d*A;
}
std::cout<<A<<" "<<B<<std::endl;
}
return 0;
}