PKU 1046-Square Number(数论)

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;
                }


全局题号
5981
添加于
2013-06-02
提交次数
286
尝试人数
74
通过人数
57
Other language verions
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值