Возможно, я что-то упускаю, но мне кажется, что эта программа дает неправильный ответ. Это выключено одним. Если я установлю MAX
на 10, он выключится на два.
Я читал, что некоторым игрокам нравится давать приблизительные ответы, а затем атаковать по словарю серверы Project Euler, чтобы решить проблему. Другие игроки считают, что скорее против духа вещи.
В любом случае - подобный алгоритм (начиная с N * M и исключающий дубликаты) является правильным способом решения проблемы, но, как написано, этот код не имеет большого смысла для меня. Обратите внимание, что в любом случае int(MAX*(log(i)/log(j)))
очень чувствителен к ошибке округления; но даже если вы устраните этот источник ошибок с помощью целочисленной арифметики, программа все равно даст неправильный ответ.
РЕДАКТИРОВАТЬ: Как мы можем (правильно) подсчитать дубликаты?
Сначала вы должны понять, что два числа одинаковы, если они имеют одинаковую простую факторизацию. Так что будут только дубликаты a 1 b 1 = a 2 b 2 при a 1 и a 2 - это различные целочисленные степени одного и того же целого числа, которое я назову x . Например,
- 9 7 = 3 14 ; это возможно, потому что 9 и 3 являются степенями 3.
- 8 6 = 4 9 ; это возможно, потому что 8 и 4 являются степенями 2.
Итак, мы установили, что для всех дубликатов a 1 = x e 1 и a 2 = x e 2 для некоторых целых чисел x , e 1 и e 1 .
Затем с небольшой алгеброй,
a 1 b 1 = a 2 б 2
x e 1 b 1 = x * ** одна тысяча сто тридцать четыре тысяча сто тридцать-пять * е * 1 136 * 2 B * 1 141 * 2
e 1 b 1 = e 2 b 2
Возвращаясь к более ранним примерам,
- 9 7 = 3 14 , потому что 2 & times; 7 = 1 & times; 14.
- 8 6 = 4 9 , потому что 3 & times; 6 = 2 & times; 9.
Таким образом, чтобы найти все дубликаты для любого данного x , вам нужно только найти дубликаты для более простого выражения eb , где 2 & le; x e & le; 100 и 2 & le; b & le; 100.
Вот изображение этой более простой проблемы: для x = 3 и b от 2 до 10. Я отметил два места, где есть дубликаты.
e=1 a=3 *********
e=2 a=9 * * * * * * * * *
e=3 a=27 * * * * * * * * *
e=4 a=81 * * * * * * * * *
| |
1*8 = 2*4 = 4*2 3*8 = 4*6
3^8 = 9^4 = 81^2 27^8 = 81^6
А вот и дубликаты:
e=1 a=3 *********
e=2 a=9 x x x x * * * * *
e=3 a=27 x x x * x * * * *
e=4 a=81 x x x x x * * * *
Программа на C ++, которую вы нашли, пытается подсчитать их, посещая каждую пару перекрывающихся строк i и j и вычисляя, сколько из строки i перекрывает строку j. Но опять же, если я что-то упустил, программа кажется безнадежно неточной. И он полностью пропускает некоторые пары строк (у вас никогда не бывает i = 9 и j = 27 или i = 27 и j = 81).