NOIP复习模拟赛day1

首先先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++
View Code

  

猜你喜欢

转载自www.cnblogs.com/to-the-end/p/9902365.html
今日推荐