HDU4143(数论)

题意:找出最小的正整数 x,输入一个整数 n ,能找到一个整数 y ,满足 y2=n+x,题目要求 n<=109

解题思路:如果要按正常方法从小到大遍历,由于数据量大一定会超时。其实上述式子转化后可以分解因子:n = ( y - x )*( y + x ) ;令 y - x = i,所以有 x + y = n / i ,即 ( n / i - i ) / 2 = x.

注意:x 要大于 0 ,当 n 是完全平方数时要注意。

View Code
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     int t,i,n;
 9     cin>>t;
10     while(t--)
11     {
12        cin>>n;
13        for(i=sqrt(n);i>0;i--)
14        {
15           if(n%i==0&&(n/i-i)%2==0&&n/i!=i)
16           {
17               cout<<(n/i-i)/2<<endl;
18               break;
19           }
20        }
21        if(i==0) cout<<-1<<endl;
22     }
23     return 0;
24 }

 

posted @ 2012-03-21 09:06  笑巧  阅读(434)  评论(0编辑  收藏  举报