思路:思维题。首先直接算最大的lcm比较困难,我们用另一个转换式子:,这个写法是防溢出的。因此我们要让
最大,就需要让
最大,
最小
对于最大这个要求来说,我们根据题目说的
条件,以及高中学过的基本不等式,即
的前提下,有
,转化式子得到
,当且仅当
时取得
的最大值
对于最小来说,他只可能是1,因此我们可以写个gcd函数来方便后面的验证,当然python也可以直接调用math.gcd,这里我习惯自己手写
所以说有了上面两个分析之后,我们就可以先把一分为二,然后再判断
与
的
是否为1。如果两者的
为1,不用操作;如果不为1,那就不断a--和b++(这样能保证两者的和始终为n),直到两者的gcd为1时停止。最终,输出结果即可
代码:
import sys
input = lambda: sys.stdin.readline().strip()
import math
inf = 10 ** 18
def I():
return input()
def II():
return int(input())
def MII():
return map(int, input().split())
def LI():
return input().split()
def LII():
return list(map(int, input().split()))
def LFI():
return list(map(float, input().split()))
fmax = lambda x, y: x if x > y else y
fmin = lambda x, y: x if x < y else y
isqrt = lambda x: int(math.sqrt(x))
'''
'''
def gcd(a, b):
return a if b == 0 else gcd(b, a % b)
def solve():
n = II()
a, b = n // 2, n - n // 2
while gcd(a, b) != 1:
a -= 1
b += 1
print(a, b)
# t = 1
t = II()
for _ in range(t):
solve()

京公网安备 11010502036488号