Как решить проблему грубой силы, используя ассоциативный контейнер? - PullRequest
0 голосов
/ 24 марта 2019

считать число (a, b, c) (1≤a, b, c≤n), удовлетворяющее a ^ k + b ^ k = c ^ k (2≤ k ≤ 20)

Как я могу решить эту проблему, сначала восстановив все результаты 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;
}

1 Ответ

0 голосов
/ 24 марта 2019

Не существует решения для ^ k + b ^ k = c ^ k для k> 2.

Из Википедии: -

В теории чисел Последняя теорема Ферма утверждает, что никакие три натуральных числа a, b и c не удовлетворяют уравнению a ^ n + b ^ n = c ^ n для любого целого значения n, большего 2. Случаи n = 1 и n = 2 были известныиметь бесконечно много решений с древности. Это также было доказано.Таким образом, вы можете попытаться решить только для значения k = 2.

Для k = 2 Вы можете использовать эту ссылку

...