给你一个数字 n n n,你需要求出两个数 a , b a,b a,b满足 a + b = n a+b=n a+b=n且 l c m ( a . b ) lcm(a.b) lcm(a.b)最小。
我们可以发现当 g c d ( a , b ) ≠ 1 gcd(a,b) \not =1 gcd(a,b)=1的时候,那么 n % a = 0 n\%a=0 n%a=0或者 n % b = 0 n\%b=0 n%b=0,我们又可以发现,此时的 g c d ( a , b ) = g c d ( a , n − a ) = g c d ( n i , n − n i ) = g c d ( n i , n ( i − 1 ) i ) = g c d ( a , a ( i − 1 ) ) = a ( i > 1 , a ∗ i = n ) gcd(a,b) = gcd(a,n-a)=gcd(\frac{n}{i},n-\frac{n}{i})=gcd(\frac{n}{i},\frac{n(i-1)}{i})=gcd(a,a(i-1))=a(i>1,a*i=n) gcd(a,b)=gcd(a,n−a)=gcd(in,n−in)=gcd(in,in(i−1))=gcd(a,a(i−1))=a(i>1,a∗i=n)然后根据公式遍历就行了,需要注意的是当 i = 1 i=1 i=1的时候需要特判,比如 11 11 11的时候(不存在 n % i = 0 n\%i=0 n%i=0)。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
typedef vector<int> veci;
typedef vector<ll> vecl;
typedef pair<int, int> pii;
template <class T>
inline void read(T &ret) {
char c;
int sgn;
if (c = getchar(), c == EOF) return ;
while (c != '-' && (c < '0' || c > '9')) c = getchar();
sgn = (c == '-') ? -1:1;
ret = (c == '-') ? 0:(c - '0');
while (c = getchar(), c >= '0' && c <= '9') ret = ret * 10 + (c - '0');
ret *= sgn;
return ;
}
int xxxxxxxxx = 1;
inline void outi(int x) {if (x > 9) outi(x / 10);putchar(x % 10 + '0');}
inline void outl(ll x) {if (x > 9) outl(x / 10);putchar(x % 10 + '0');}
inline void debug(ll x) {cout << xxxxxxxxx++ << " " << x << endl;}
inline void debugs(string s) {cout << s << endl;}
int main() {
int t; read(t); while (t--) {
int n; read(n);
bool flag = false;
for (int i = 2; i <= sqrt(n); i++) {
if (n % i == 0) {
int x = n / i;
printf("%d %d\n", x, n - x);
flag = true;
break;
}
}
if (!flag) printf("1 %d\n", n - 1);
}
return 0;
}