Hdu 4143


题目链接

好久没有在Hdu水题了,于是乎在无聊之际还是找了一道水题,

但是看完题目之后,明显是个数学题,我还是感觉有点打触的。

因为一直对数学题没有多大信心。


分析了一下,Y^2 = X^2 + n 可以转化为 Y^2 = (X + a)^2

所以:n = a^2 + 2 * a * X , 而且 X > 0

所以 0 < a <= sqrt(n + 1) - 1

由于要求的是最小的 X, 所以只要逆序枚举 a 就可以了,

这里复杂度为 O(sqrt(n)), 所以可解。


附上代码:


#include <cmath>
#include <cstdio>

typedef long long LL;
#define min(x, y) ((x) < (y) ? (x) : (y))

int main() {
	int T, n;
	scanf("%d", &T);
	while (T--) {
		scanf("%d", &n);

		int ans = -1; 

		int k = int(sqrt(n + 1.0)) - 1;
		for (int i = k; i > 0; i--) {
			long long tmp = n - (long long)i * i;
			if (tmp % (2 * i))
				continue;
			else {
				if (ans == -1) 
					ans = tmp / (2 * i);
				else
					ans = min(ans, tmp / (2 * i));
				break;
			}
		}
		printf("%d\n", ans);
	}

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值