码迷,mamicode.com
首页 > 其他好文 > 详细

Educational Codeforces Round 38 (Rated for Div. 2) ----C

时间:2018-02-18 18:38:35      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:存在   lan   sts   lap   can   cli   log   class   hid   

C. Constructing Tests

 

经过简单的分析之后,我们可以发现,对于x,我们要求的就是一组n,m满足n^2-(n/m)^2=x。

有两种求法。

第一种:

观察n的极限范围是多少,我们发现,对于相同的n,m越大,该式值就越大,x的范围是1e9,为了得到n最大是多少,我们尽可能的减小m的值,我们发现m=1时式子没有什么意义,特判即可,当m=2时,我们发现左边为3/4*n^2,也就是说n的范围是sqrt(x)级别的,枚举n判断是否存在m即可。

第二种:
原式可以化为(n-(n/m))*(n+(n/m))=x

(n-(n/m))<(n+(n/m)),所以(n-(n/m))是sqrt级别的,枚举即可。

只写了第二种的代码

技术分享图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int t;
 4 int main()
 5 {
 6     scanf("%d",&t);
 7     while(t--){
 8         int x;
 9         scanf("%d",&x);
10         if(!x){
11             printf("1 1\n");
12             continue;
13         }
14         int i;
15         for(i=1;i*i<=x;i++){
16             if(x%i)continue;
17             int u=i,v=x/i;
18             if((u+v)%2)continue;
19             int n=(u+v)/2,m=(v-u)/2;
20             if(!m)continue;
21             m=n/m;
22             if(n*n-(n/m)*(n/m)==x){
23                 printf("%d %d\n",n,m);
24                 break;
25             }
26         }
27         if(i*i>x)printf("-1\n");
28     }
29     return 0;
30 }
View Code

 

Educational Codeforces Round 38 (Rated for Div. 2) ----C

标签:存在   lan   sts   lap   can   cli   log   class   hid   

原文地址:https://www.cnblogs.com/hyghb/p/8453001.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!