10.28T2 打表

#3865 A+B 问题

 

描述

连续几次考试太难了,都要求出一道简单题。老师想,最简单的题肯定是a+b 啊,但当老师出完数据后发现输入数据.in没了,只有输出答案数据.out了。咋办呢,就把输出当输入,改一下题吧。请输出使得和为n的两个数a,b 的最小公倍数尽可能大的数值。

输入

输入文件的第一行一个整数T 表示数据组数。

接下来T行每行一个整数n ,表示.out中的数值,即a+b=n 。

输出

共T行,每行一个整数表示最大的最小公倍数的值

样例输入[复制]
3
2
3
4
样例输出[复制]
1
2
3
提示

【数据范围】

30%的数据满足 T<=10,n<=1000

100% 的数据满足T<=10000 ,n<=10^9

 

 

 

打表发现一定两个数字是互质的

所以我们要找相邻最近的一对互质数

发现对于奇数直接拆成n/2和n/2+1两个数字

如果能被4整除显然是
n/2+1和n/2-1

如果只是2倍数非4倍数的话就是n/2-2和n/2+2

乘上去就可以了

code:

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 signed main(){
 5     long long T;
 6     cin>>T;
 7     while(T--){
 8         long long n;
 9         cin>>n;
10         if(n==2)cout<<1<<'\n';
11         else if(n==1)cout<<0<<'\n';
12         else if(n%2==1)cout<<(n/2)*(n/2+1)<<'\n';
13         else if(n%4==0)cout<<(n/2-1)*(n/2+1)<<'\n';
14         else cout<<(n/2-2)*(n/2+2)<<'\n';
15     }
16 }

over

posted @ 2018-10-28 11:33  saionjisekai  阅读(172)  评论(0编辑  收藏  举报