ここに問題へのリンクがあります。
この問題は、 1/x + 1/y = 1/z ( z = n! )の形式のディオファントス方程式の解の数を求めます。与えられた方程式を並べ替えると、答えがz 2の因数の数であることが明確にわかります。
したがって、問題はnの因数の数を見つけることに要約されます。2 ( n階乗の二乗)。
私のアルゴリズムは次のとおりです
- エラトステネスのふるいアルゴリズムを使用して、すべての素数 <= n のブール ルックアップ テーブルを作成します。
- すべての素数P <= nを反復処理し、nの指数を見つけます! . ステップ関数式を使用してこれを行いました。指数をKとすると、 Pの指数はnです! 2は2Kになります。
- ステップ 2 を使用して、標準式で因子の数を計算します。
n = 10 6の最悪の場合の入力に対して、私の C コードは 0.056 秒で答えを出します。複雑さは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;
}