1046:Square Number

总时间限制:
1000ms
内存限制:
65536kB
描述

给定正整数b,求最大的整数a,满足a*(a+b) 为完全平方数

输入
多组数据,第一行T,表示数据数。对于每组数据,一行一个正整数表示b。
T <= 10^3, 1 <= b <= 10^9
输出
对于每组数据,输出最大的整数a,满足a*(a+b)为完全平方数
样例输入
3
1
3
6
样例输出
0
1

2
思路:a*(a+b);gcd(a,b) = gcd(a,a+b),这个符合辗转相除,然后a*(a+b)=gcd^2(a1)*(a1+b1),那么a1与a1+b1互质
然后a1必定为一个数的平方x1^2,(a1+b1)为某个数的平方y^2;那么gcd(x,y)=1,然后b1=(x+y)(x-y);那么a=gcd*x^2,b1为
b的因子,所以枚举b1,再枚举b1的因子解出x,y

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<string.h>
 5 #include<queue>
 6 #include<set>
 7 #include<math.h>
 8 using namespace std;
 9 typedef long long LL;
10 LL gcd(LL n,LL m) {
11         if(m == 0)return n;
12         else return gcd(m,n%m);
13 }
14 LL slove(LL n);
15 int main(void) {
16         int T;
17         scanf("%d",&T);
18         while(T--) {
19                 LL n;
20                 scanf("%lld",&n);
21                 printf("%lld
",slove(n));
22         }
23         return 0;
24 }
25 LL slove(LL n) {
26         LL maxx = -1;
27         LL x = sqrt(1.0*n);
28         int i,j;
29         for(i = 1; i <= x ; i++) {
30                 if(n%i==0) {
31                         int x1 = i;
32                         int x2 = n/i;
33                         for(j = 1; j <= sqrt(1.0*x1); j++) {
34                                 if(x1%j == 0) {
35                                         LL  k = x1/j;
36                                         //if(gcd(k,j)==1)
37                                         {
38                                                 if((k+j)%2==0) {
39                                                         LL xx = (k-j)/2;
40                                                         LL yy = (k+j)/2;
41                                                         if(gcd(xx,yy)==1)
42                                                                 maxx = max(maxx,xx*xx*x2);
43                                                 }
44                                         }
45                                 }
46                         }
47                         for(j = 1; j <= sqrt(1.0*x2); j++) {
48                                 if(x2%j == 0) {
49                                         LL  k = x2/j;
50                                         //if(gcd(k,j)==1)
51                                         {
52                                                 if((k+j)%2==0) {
53                                                         LL xx = (k-j)/2;
54                                                         LL yy = (k+j)/2;
55                                                         if(gcd(xx,yy)==1)
56                                                                 maxx = max(maxx,xx*xx*x1);
57                                                 }
58                                         }
59                                 }
60                         }
61                 }
62         }
63         return maxx;
64 }





油!油!you@
原文地址:https://www.cnblogs.com/zzuli2sjy/p/5926027.html