四平方和
阿新 • • 發佈:2020-09-22
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(intj = 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大的情況了。