四平方和

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大的情况了。

posted @ 2020-09-21 22:05  funforever  阅读(173)  评论(0编辑  收藏  举报