CF1285C Fadi and LCM
题目链接:CF1285C
题意:给定一个数x,要找出两个数a,b,使得a,b的最小公倍数等于x。且a,b中最大的值尽可能的小。即max(a,b)尽可能小。
思路:如果x为1或者x为质数,则输出1以及它本身。否则就通过暴力枚举,时间复杂度为sqrt(n)。
代码如下:
#include<bits/stdc++.h>
using namespace std;
bool isPrime(long long x) {
if (x <= 1)
return false;
if (x == 2)
return true;
if (x % 2 == 0)
return false;
long long i, m;
m = sqrt(x);
for (i = 2; i <= m; i++) {
if (x % i == 0)
return false;
}
return true;
}
long long gcd(long long m, long long n) {
return m % n == 0 ? n : gcd(n, m % n);
}
int main() {
long long x;
while (cin >> x) {
if (x == 1||isPrime(x))
cout << 1 << ' ' << x << endl;
else {
pair<long long, long long > ans;
long long i, m;
m = sqrt(x);
long long a, b;
ans.first = ans.second = LLONG_MAX;
for (i = 1; i <= m; i++) {
a = i;
if (x % a == 0) {
b = x / a;
long long g = gcd(a, b);
if (b < ans.second && (g == 1 || a == 1)) {
ans.first = a;
ans.second = b;
}
}
}
cout << ans.first << ' ' << ans.second << endl;
}
}
return 0;
}