四平方和
0<N<5∗106
暴力O3必超时,解决方法:枚举O2的c和d的值采用哈希映射的方式快速找到c和d。
AC代码:
#include <bits/stdc++.h> using namespace std; const int maxn = 5000005; pair<int, int> hashes[maxn]; int main() { int n; bool flag = false; scanf("%d", &n); for(int i = 0; i <= sqrt(n / 2); i++) for(int j = i; j <= sqrt(n); j++) if(i * i + j * j <= n && hashes[i * i + j * j] == make_pair(0, 0)) hashes[i * i + j * j] = make_pair(i, j); for(int i = 0; i <= sqrt(n / 4); i++) { for(int j = i; j <= sqrt(n / 2); j++) { int right = n - i * i - j * j; if(hashes[right] != make_pair(0, 0)) { printf("%d %d %d %d\n", i, j, hashes[right].first, hashes[right].second); flag = true; break; } } if(flag) break; } return 0; }
有一个问题,我们取第一个为hashes,可以保证c和d的最小,但是c是否小于等于b?答案是肯定的,因为如果c小于b,那么当b等于c的时候,c就应该是b,那么此时就已经找到了答案,就不会出现b比c大的情况了。