1. 程式人生 > 實用技巧 >四平方和

四平方和

0<N<5106

暴力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大的情況了。