4 6 25 81 105
False True True TrueHintFor the fourth case,105 = 1 32 − 82
/************************************************************************/
附上该题对应的中文题
ztr喜欢研究数学,一天,他在思考直角三角形方程组的Lower版,即n=x2−y2,他想知道,对于给出的n,是否会有正整数解。
有T组数据,第一行为一个正整数T(T<=106),每一行一个正整数n,n<=1018
如果有正整数解,输出True,否则输出False
4 6 25 81 105
False True True True
对于第四个样例,有一组解132−82=105
出题人的解题思路:
考虑题目的原型,即给定z,寻找是否存在一组(x,y),满足x2−y2=z
我们可以构造两组等式[(k+1)2−k2=2k+1(k+1)2−(k−1)2=4k], 很容易得出结论,当z为奇数或者4的倍数时,方程一定有正整数解
故而x+y与x-y必定同奇同偶
①当x+y与x-y同为奇数时,不妨构造x-y=1
那么只需n≠1且n为奇数,那么方程组必定有解;
②当x+y与x-y同为偶数时,不妨构造x-y=2
那么只需n≠4且n为4的倍数,那么方程组必定有解
/*Sherlock and Watson and Adler*/ #pragma comment(linker, "/STACK:1024000000,1024000000") #include<stdio.h> #include<string.h> #include<stdlib.h> #include<queue> #include<stack> #include<math.h> #include<vector> #include<map> #include<set> #include<cmath> #include<complex> #include<string> #include<algorithm> #include<iostream> #define exp 1e-10 using namespace std; const int N = 100005; const int M = 40; const int inf = 100000000; const int mod = 2009; int main() { int t; __int64 n; scanf("%d",&t); while(t--) { scanf("%I64d",&n); if(n%2&&n!=1) puts("True"); else if(n!=4&&n%4==0) puts("True"); else puts("False"); } return 0; }菜鸟成长记