儿童节快乐
题目描述:五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。今天是六一儿童节,小蓝老师为了让大家在节日里享受解题的乐趣,特地准备了一道有趣的题目。题目内容为:求出所有满足以下条件的整数 n 的总和:
- (n+10120300500) 是一个完全平方数。
- (n−10120300500) 也是一个完全平方数。
一个数如果可以表示为另一个整数的平方,那么这个数就叫做完全平方数。例如,4 可以表示为 2 的平方,9 可以表示为 3 的平方,因此 4 和 9 都是完全平方数。请大家用心仔细地思考,求出答案。同时祝大家儿童节快乐,解题过程开心顺遂!
解题思路:如果直接枚举n,n的没范围,可以无限大。
∵ n+10120300500 是完全平方数。
n−10120300500 是完全平方数。
∴ 设 n+10120300500=a2。
n−10120300500=b2。
∴a2 −10120300500 = b2 +10120300500。
∴(a+b)(a−b)=20240601000。
设 x=a+b,y=a−b。
∴xy=20240601000。
a=(x+y)/2。
b=(x−y/2。
∵a,b∈Z。
∴x+y≡0(mod2)。
//本题思路
#include <bits/stdc++.h>
using namespace std;
bool check(long long n);
__int128 s;
int main()
{
long long x, y, ans, a, b;
long long z = 20240601000 / 2;
for (y = 2; y <= z / 2; y++) //y小于一半
{
if (z % y == 0)
{
x = z / y;
if ( (x + y) % 2 == 1)
continue;
if ((x - y) % 2 == 1)
continue;
a = (x + y) / 2;
b = (x - y) / 2;
if ( check(a) && check(b))
{
ans = y;
break;
}
}
}
x = z / y;
z = (x + y) / 2;
ans = z * z - 10120300500;
cout << ans << endl;
}
bool check(long long n)
{
long long t = sqrt(n);
return t * t == n;
}