题目
思路
先遍历c,d。标记各个(c*c + d*d),存储产生(c*c + d*d)结果的第一个也是最小字典对(c, d)。
再遍历a, b。查找剩余(n - a*a - b*b)是否在之前的c,d遍历中出现过。返回第一个结果,也就是最小字典对(a, b)。
代码
#include<bits/stdc++.h>
using namespace std;
int n, cm, dm;
int Hash[5000010];
int cHash[5000010];
int dHash[5000010];
int main()
{
cin >> n;
for(int c = 0; c*c <= n; c++)
for(int d = c; c*c + d*d <= n; d++)
{
Hash[c*c +d*d] ++;
if(Hash[c*c +d*d] == 1)
{
cHash[c*c + d*d] = c;
dHash[c*c + d*d] = d;
}
}
for(int a = 0; a*a <= n; a++)
for(int b = a; a*a + b*b <= n; b++)
{
if(Hash[n - a*a - b*b])
{
cout << a << " " << b << " " << cHash[n - a*a - b*b] << " " << dHash[n - a*a - b*b];
return 0;
}
}
return 0;
}