【问题标题】:How to solve the brute-force problem using associative container?如何使用关联容器解决暴力破解问题?
【发布时间】: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


【解决方案1】:

对于 k>2,没有 a^k+b^k=c^k 的解。

来自维基百科:-

在数论中费马大定理指出,对于任何大于 n 的整数值,没有三个正整数 a、b 和 c 满足方程 a^n + b^n = c^n 2. 自古以来,n = 1 和 n = 2 的情况就已知有无穷多个解 这也得到了证明。 因此,您可以尝试仅求解 k=2 的值。

对于k=2你可以使用这个link

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 2022-01-15
    • 2017-07-04
    • 2011-03-28
    相关资源
    最近更新 更多