【发布时间】:2019-03-24 03:36:15
【问题描述】:
统计满足a^k+b^k=c^k(2≤k≤20)的(a,b,c)(1≤a,b,c≤n)个数
如何解决这个问题,首先恢复 a^k + b^k 的所有结果,然后相应地匹配 c^k?
当我输入 n = 10 时,计数是 876,为什么会这样?
#include<iostream>
#include<cmath>
#include<map>
#include<set>
using namespace std;
int main()
{
int n;
cin >> n;
int count = 0;
map<int, set<int> > hash;
for(int k = 2; k <= 20; ++k)
{
set<int> s;
hash[k] = s;
}
for(int c = 1; c <= n; ++c)
for(int k = 2; k <= 20; ++k)
hash[k].insert(pow(c,k));
for(int k = 2; k <= 20; ++k)
cout << "k=" << k << " -- " << hash[k].size() << endl;
for(int k = 2; k <= 20; ++k)
{
for(int a = 1; a <= n; ++a)
for(int b = 1; b <= n; ++b)
{
if(hash[k].find(pow(a,k) + pow(b,k)) != hash[k].end())
count++;
}
}
cout << count << endl;
return 0;
}
【问题讨论】:
-
int几乎可以肯定没有足够的位来表示数字pow(10,20)。 -
顺便说一下,你的算法是计算一个解决方案两次。例如,如果 a = 3 和 b=4,是一个解决方案,您的算法会将 a = 4 和 b=3 视为另一个解决方案。而且,仅完成@aschepler cmets,我认为
long long也没有足够的位用于pow(10, 20)。
标签: c++ associative