首先先bb一下day1的题目名字怎么都这么鬼才......
1.两情
(sweethearts.pas/c/cpp)
【问题描述】小 W 将要去和小 K 约会啦!但聪(ao)明(jiao)的小 K 并不想让小 W 那么容易知道他们的约会地点。于是小 W 收到了一条信息:“给定两个数的和 n,请你求出这两个数的最小公倍数的可能值的最大值,作为交换,如果你给出了正确答案,我将会把你和小 K的约会地点告诉你。”众所周知,小 W 是个数学弱渣,他只好求助数学巨佬小 H,但小 H 并不屑于做这种简单题,于是帮助小 W 的任务就交给你啦!
【输入】输入文件的第一行一个整数 T 表示数据组数。接下来 T 行每行一个整数 n ,表示给定的两个数的和 n。
【输出】共 T 行,每行一个整数表示和为 n 的两个数的最小公倍数的可能值的最大值。
【输入样例】3
2
3
4
【输出样例】1
2
3
【数据范围】30%的数据满足 T<=10,n<=1000
100% 的数据满足 T<=10000 ,n<=109
官方题解:
算法描述
100%
若n为奇数,则a和b相差 1 最优
若n为偶数,令m = n/2,若m - 1和m + 1均为奇数,则a = m - 1, b = m + 1
否则a = m - 2, b = m + 2
时间复杂度O(1)
考察内容 特判,分类讨论
难度:简单
(是不是感觉题解没什么用,鬼才能想出来)
自己bb的题解:
其实,按照题目说的,要求max{lcm(x,y)}并且x+y=n。
那么可以有: y=n-x;
并且lcm(x,y)=lcm(x,n-x);
根据一个玄学的定理:lcm(x,y)=x*y/gcd(x,y)=x*(n-x)/gcd(x,n-x);
也就是说当x*(n-x)越大,gcd(x,n-x)越小时,lcm(x,y)越大;
还有一个初中的定理:那就是当周长相同时,正方形的面积越大;
那么根据这个定理,我们就可以知道,当x跟y相差的值越小x*y越大;
另外一个,当x,y互质的时候gcd(x,y)=1最小;(互质是啥意思呢???就是x,y的公约数只有一个1。是不是很luozhi)
OK,那么我们刚开始可以令x=y=n/2;
然后x不断的减1,y不断的加1,在这个过程中我们要不断的求gcd(x,y),看它是否为1,如果它为1,我们就退出循环,最后max{lcm(x,y)}=x*y;
最后一定要记得开long long
一定要记得开long long
一定要记得开long long
好了,上代码......
1 //NOIPRP++ 2 #include<bits/stdc++.h> 3 #define Re register int 4 #define LL long long 5 using namespace std; 6 LL T,x,l,r,Mid; 7 inline void read(LL &x){ 8 x=0; char c=getchar(); bool p=1; 9 for (;'0'>c||c>'9';c=getchar()) if (c=='-') p=0; 10 for (;'0'<=c&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48); 11 p?:x=-x; 12 } 13 int main(){ 14 Re i,j; 15 read(T); 16 while (T--){ 17 read(x); 18 l=x>>1;r=x-l; 19 while (l<=r){ 20 if (__gcd(l,r)==1){//C++自带函数gcd...... 21 printf("%lld\n",l*r); 22 break; 23 } 24 l--;r++; 25 } 26 } 27 return 0; 28 } 29 //NOIPRP++