HDU4143(数论)
题意:找出最小的正整数 x,输入一个整数 n ,能找到一个整数 y ,满足 y2=n+x2 ,题目要求 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 }
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 }