这道题关于分子已经是有理数的证明过程就不写了,另外想说的一点就是关于强制转换,比方说int a,b;long long sum;
要计算(a*a+b*b),在a*a+b*b有可能超出int范围时,强制转换成long long时,下面的做法是错误的:
sum=(long long)(a*a+b*b)
因为超出以后已经变成负数了,在强制也还是负的;应该这样:
sum=(long long)a*a+b*b;
这样,在计算过程中转化为long long了;以前在这个问题上是个误区,谨记。。
证明:
引理1:若cosA 为有理数,n 为整数,则cos(nA)也为有理数。
证:n=1,2 时,cos(nA)为有理。
若 n=1..k 时均成立,即n<=k 时,cos(nA)为有理数,此时有cos(kA) =
cos((k-1)A)*cos(A) - sin((k-1)A)*sin(A),故sin((k-1)A)*sin(A)
有理。
当 n=k+1 时:
有cos((k+1)A) = cos((k-1)A)*cos(2A) - sin((k-1)A)*sin(2A) =
cos((k-1)A)*cos(2A) - sin((k-1)A)*2*sinA*cosA.
由于sin((k-1)A)*sin(A)与cos(nA)(其中n<=k)有理.
故cos((k+1)A)有理,所以对所有正整数n,cos(nA)为有理数,由此可得对
所有整数n,cos(nA)为有理数。证毕
引理 2:若cosA 为有理数,则sin(nA) = u*sinA,其中u 为一有理数。
证:n=1 时成立。
若 n=k 成立,即sin(kA)=u*sinA,其中u 为有理数,则sin((k+1)A) =
sin(kA)*cosA + sinA*cos(kA) , 由引理1 得cos(kA) 有理, 故
sin((k+1)A) = (u*cosA+cos(kA)) * sinA = v*sinA 中的v 为有理
数,得证。
#include<stdio.h>
#include<math.h>
int main()
{
int t,a,b,c,n,m,k;
long long int sum,p;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d%d%d%d",&a,&b,&c,&n,&m,&k);
sum=(4ll*a*a*b*b)-((long long )a*a+b*b-c*c)*((long long)a*a+b*b-c*c);
p=(long long)sqrt((double)sum);
if(p*p==sum)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}