题意描述:给出一个n,要求在所有满足n = a+b的a和b里面求a和b的最小公倍数最大的两个数的最小公倍数。
解题报告:比赛的时候看到这个题的第一反应就是寻找这两个数一定是在a和b比较接近的地方找,这样才能保证a和b的最小公倍数最大,首先,奇数和偶数是一定要分开的讨论的,因为奇数和偶数的一半是不同的,奇数的一半可能就是所要的结果,但是偶数的一半可以确定一定不是所要的结果,因为偶数一半刚好a和b就相等了,最小公倍数就是他们本身了,这是最小的了,然后偶数里面又要分开讨论,一种是这个偶数的一半是奇数,另一种是这个偶数的一半也是偶数的情况,对于是奇数的,结果就是将一半分别进行加2减二得到,然后对于是偶数的只要加1和减1就可以了,然后求他们的最小公倍数,所求出来的一定是最大的。
1 #include<cstdio> 2 #include<cstring> 3 typedef __int64 INT; 4 5 INT GCD(INT a,INT b) { 6 return a%b==0? b:GCD(b,a%b); 7 } 8 int main() { 9 int T; 10 INT n; 11 scanf("%d",&T); 12 while(T--) { 13 INT temp,max; 14 scanf("%I64d",&n); 15 if(n == 2) { 16 printf("1\n"); 17 continue; 18 } 19 temp = n/2; 20 if(n & 1) 21 printf("%I64d\n",((n-temp)/GCD(n-temp,temp))*temp); 22 else { 23 if(n == 2) 24 printf("1\n"); 25 else if(temp & 1) 26 printf("%I64d\n",((temp+2)/GCD(temp+2,temp-2))*(temp-2)); 27 else printf("%I64d\n",((temp+1)/GCD(temp+1,temp-1))*(temp-1)); 28 } 29 } 30 return 0; 31 }