2016藍橋杯 四平方和
阿新 • • 發佈:2019-01-06
好菜好菜,昨晚打CF又掉分了,快要掉到萬里之外了。。。
題目大家都看過,我就不再贅述題目了。如果用4個for迴圈會超時,必須要優化。
直接把兩個數的平方和打表,然後列舉前兩個數,就可以把複雜度降到O(n^2)。
PS:此題用到了打表這個很好的思想。
#include<cstdio> #include<cstring> #include<cmath> const int maxn=5000000; int res[maxn]; int main(void) { memset(res,0,sizeof(res)); for(int i=0;i<2237;++i) for(int j=0;j<2237;++j) { if(i*i+j*j<=maxn) res[i*i+j*j]=1; } int n;scanf("%d",&n); int m=sqrt(n)+0.5; printf("%d\n",m); int flag=0; for(int i=0;i<=m;++i) { for(int j=0;j<=m;++j) { if((n-i*i-j*j)>=0&&res[n-i*i-j*j]) { for(int k=0;k<=m;++k) { double p=sqrt((n-i*i-j*j-k*k)); if(p==floor(p)) { printf("%d %d %d %d\n",i,j,k,(int)p); flag=1; break; } } } if(flag) break; } if(flag) break; } return 0; }
如有不當之處歡迎指出!