ここにはの問題があります。アルゴリズムの最適化
問題がフォーム 1/X + 1/Y = 1/Z( Z = N!)のディオファントス方程式の解の数を尋ねます。与えられた方程式を再整理すると、答えは因子数が zであることが明らかです。
問題は、要因の数が nです。。
私のアルゴリズムは
- を次のようにすべての素数<のブールルックアップテーブルを作成している= Nエラトステネスアルゴリズムのふるいを使用して。全ての素数を超える
- 反復 P < = Nと nは、指数を見つけて下さい!。私はステップ関数式を使ってこれを行いました。指数を Kとし、次に指数 Pを n!とします。は、 2Kとなります。
- 手順2を使用して、標準式で係数の数を計算します。
N = 10、私のCコードは、0.056sで答えを与えます。 私は複雑さが O(ng 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