1. 程式人生 > >Educational Codeforces Round 38 (Rated for Div. 2) ----C

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

none struct 12px 存在 lose tar u+ bit http

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