HDU 4627 The Unsolvable Problem 杭电多校联赛第三场1009 数学题

时间:2023-03-08 21:53:43

题意描述:给出一个n,要求在所有满足n = a+b的a和b里面求a和b的最小公倍数最大的两个数的最小公倍数。

解题报告:比赛的时候看到这个题的第一反应就是寻找这两个数一定是在a和b比较接近的地方找,这样才能保证a和b的最小公倍数最大,首先,奇数和偶数是一定要分开的讨论的,因为奇数和偶数的一半是不同的,奇数的一半可能就是所要的结果,但是偶数的一半可以确定一定不是所要的结果,因为偶数一半刚好a和b就相等了,最小公倍数就是他们本身了,这是最小的了,然后偶数里面又要分开讨论,一种是这个偶数的一半是奇数,另一种是这个偶数的一半也是偶数的情况,对于是奇数的,结果就是将一半分别进行加2减二得到,然后对于是偶数的只要加1和减1就可以了,然后求他们的最小公倍数,所求出来的一定是最大的。

 #include<cstdio>
#include<cstring>
typedef __int64 INT; INT GCD(INT a,INT b) {
return a%b==? b:GCD(b,a%b);
}
int main() {
int T;
INT n;
scanf("%d",&T);
while(T--) {
INT temp,max;
scanf("%I64d",&n);
if(n == ) {
printf("1\n");
continue;
}
temp = n/;
if(n & )
printf("%I64d\n",((n-temp)/GCD(n-temp,temp))*temp);
else {
if(n == )
printf("1\n");
else if(temp & )
printf("%I64d\n",((temp+)/GCD(temp+,temp-))*(temp-));
else printf("%I64d\n",((temp+)/GCD(temp+,temp-))*(temp-));
}
}
return ;
}