Educational Codeforces Round 38 (Rated for Div. 2) ----C
阿新 • • 發佈:2018-02-18
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 } 14View Codeint 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 }
Educational Codeforces Round 38 (Rated for Div. 2) ----C