题意:
给定一个正整数n,让你求两个数a,b,使得a+b=n,且使得lcm(a,b)最小
思路:
关于lcm的一些结论:
1.若a是质数,则a和其他任意数的lcm就是其乘积
2.若a是合数,那么a和它的约数的lcm就是a
对于这道题,我们考虑a是合数的情况,当a是合数且n-a是a的约数时就是合法解,我们去找合法解的最优解
即我们要找到这样的a,使得a是合数,且a%(n-a)==0,统计这样的a的最大值
设小的数为a,大的数就是ka
a+ka=n
所以a是n的约数,因此我们去枚举约数就行,取最大的约数就行
Code:
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,ans=1;
void solve(){
ans=1;
cin>>n;
for(int i=2;i*i<=n;i++){
if(n%i==0) ans=max(ans,n/i);
}
cout<<ans<<" "<<n-ans<<'\n';
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T=1;
cin>>T;
while(T--)solve();
return 0;
}
总结:
关于lcm的一些结论:
1.若a是质数,则a和其他任意数的lcm就是其乘积
2.若a是合数,那么a和它的约数的lcm就是a
3.常用的关于lcm的构造题技巧:
lcm(a,ka):使lcm最小
lcm(a,b),其中gcd(a,b)=1:lcm最大
关于gcd的一些技巧:经常用到枚举gcd,设k倍的gcd这种小技巧,这样会好想一点