Задача link.Оптимизация алгоритма
Проблема задает число решений уравнения диофантовой вида 1/х + 1/у = 1/г (где г = п!). Перестановка данного уравнения ясно говорит о том, что ответом является число факторов z.
Так проблема кипит, чтобы найти количество факторов n!.
Мой алгоритм выглядит следующим образом
- Сделать булево посмотреть таблицу для всех простых чисел < = п с помощью решета Эратосфена алгоритма.
- Iterate все простые числа P < = п и найти свой показатель в п!. Я сделал это, используя формулу функции шага. Пусть показатель равен K, тогда показатель P в n! будет 2K.
- Используя шаг 2, вычислите количество факторов со стандартной формулой.
Для наихудшего случая ввода п = 10, мой с код дает ответ в 0.056s. Я предполагаю, что сложность не превосходит O (n lg n). Но когда я отправил код на сайт, я мог бы пройти только 3/15 тестовых случаев с приговором остальных, поскольку превышен лимит времени.
Мне нужна подсказка для оптимизации этого алгоритма.
код до сих пор:
#include <stdio.h>
#include <string.h>
#define ULL unsigned long long int
#define MAXN 1000010
#define MOD 1000007
int isPrime[MAXN];
ULL solve(int N) {
int i, j, f;
ULL res = 1;
memset(isPrime, 1, MAXN * sizeof(int));
isPrime[0] = isPrime[1] = 0;
for (i = 2; i * i <= N; ++i)
if (isPrime[i])
for (j = i * i; j <= N; j += i)
isPrime[j] = 0;
for (i = 2; i <= N; ++i) {
if (isPrime[i]) {
for (j = i, f = 0; j <= N; j *= i)
f += N/j;
f = ((f << 1) + 1) % MOD;
res = (res * f) % MOD;
}
}
return res % MOD;
}
int main() {
int N;
scanf("%d", &N);
printf("%llu\n", solve(N));
return 0;
}
.. и ваш код до сих пор есть? –
Я уверен, что ваше сито слишком медленное. Для лечения «n = 10^6» ничего не должно быть близко к 0,56 секундам. –
@MartinJames: Я добавил ссылку для своего кода. – svm11