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)令其等于(a+t)*(a+t),将右式乘开得:a*a+2*a*t+t*t,令左右等式相等得:a=t*t/(b-2*t);因为a是非负整数,且a随t的增大而增大,这里很容易证明,因为等式a*a+a*b=
a*a+2*a*t+t*t,b是一定值,所以a必然随t的增大而增大,又0<=a<b/2,故令t尽量接近于b/2即可,接下来就是对b的取值分类讨论了。。。。
- (1)b是奇数,则t=(b-1)/2(没什么可说的)
- (2)b是偶数,此时又要分两种情况(由等式知t此时必为偶数):
- 1.若(b-2)/2是偶数,则t=(b-2)/2
- 2.若(b-2)/2是奇数,则t=(b-2)/2-1=(b-4)/2;
-
#include<map> #include<stack> #include<queue> #include<vector> #include<math.h> #include<stdio.h> #include<iostream> #include<string.h> #include<stdlib.h> #include<algorithm> using namespace std; typedef long long ll; #define inf 1000000000 #define mod 1000000007 #define maxn 200005 #define lowbit(x) (x&-x) #define eps 1e-10 int main(void) { ll t,T,b; scanf("%lld",&T); while(T--) { scanf("%lld",&b); if(b%2) { t=(b-1)/2; printf("%lld\n",t*t); } else if(b%2==0 && (b-2)/2%2==0) { t=(b-2)/2; printf("%lld\n",t*t/2); } else { t=(b-4)/2; printf("%lld\n",t*t/4); } } return 0; }
-
- 2.若(b-2)/2是奇数,则t=(b-2)/2-1=(b-4)/2;
- 1.若(b-2)/2是偶数,则t=(b-2)/2
- (2)b是偶数,此时又要分两种情况(由等式知t此时必为偶数):
- (1)b是奇数,则t=(b-1)/2(没什么可说的)
- 题解:观察式子a*(a+b)令其等于(a+t)*(a+t),将右式乘开得:a*a+2*a*t+t*t,令左右等式相等得:a=t*t/(b-2*t);因为a是非负整数,且a随t的增大而增大,这里很容易证明,因为等式a*a+a*b=
a*a+2*a*t+t*t,b是一定值,所以a必然随t的增大而增大,又0<=a<b/2,故令t尽量接近于b/2即可,接下来就是对b的取值分类讨论了。。。。