四平定理,又称拉格朗日定理:
每个正整数最多可表示为4个正整数的平方和。
包括0在内,正好可以表示为四个数的平方和。
例如:
5=0^2 0^2 1^2 2^2
7=1^2 1^2 1^2 2^2
对于给定的正整数,平方和的表示法可能存在多个。
你要求对四个数进行排序:
0abcd
然后,对于所有可能的表示法,a、b、c、d用联合主键按升序排列,最后输出最初的表示法。
输入格式
输入正整数n。
输出格式
输出4个非负整数,按照从小到大的顺序排列,之间用空格隔开。
数据范围
0N5106
输入样例:
5 输出样例:
0 0 1 2
暴力:可以错过大部分数据
但是结果超时了
# includecstdiousingnamespacestd; const int N=1e7; int nn; int main () Scanf ) ' %d ',nn ); for(intI=0; i2500; I ) for(intj=I; j2500; j ) for(intm=j; m2500; m () for ) intn=m; n2500; n ) if(I*Ij*jm*mn==nn ) ) printf('%d%d%d )、I、j、m、n ); 返回0; } } } } } return 0; }
优化:
引出一楼的for循环后,即使过了两个测试点,结果也超时了
# include cstdio # includecmathusingnamespacestd; const double N=1e7; 双精度nn; int main () scanf ) ' %lf ',nn ); for(doubleI=0; i2500; I ) for(doublej=I; j2500; j ) for(doublem=j ); m2500; m () if ) sqrt(nn-I*I-j*j-m*m )=(int ) sqrt ) nn-I*I-j*j-m*m ) ) printf(%d%d%d(d ) d } } } } return 0; }
优化判断流程:
# include cstdio # includecmathusingnamespacestd; const int N=1e7; int nn; int main () Scanf ) ' %d ',nn ); for(intI=0; i*inn; I ) for(intj=I; i*i j*jnn; j ) for(intm=j; i*i j*j m*mnn; m ) { int t=nn-i*i-j*j-m*m; intk=sqrt(t; if(k*k==t ) printf('%d%d%d ',I,j,m,k ); 返回0; } } } }}