私は、配列aにa [0]、a [1]、.....、a [n-1]のような整数が格納されていて、それぞれa[i] <= 10^12
とn <100
です。今、これらの整数のLCMのすべての素因数、すなわち{a [0]、a [1]、...、a [n-1]のLCMを見つける必要がある。n個の整数の1cmのすべての素因数を計算するには?
I方法がありますが、より効率的な方法が必要です。
私の方法:
First calculate all the prime numbers up to 10^6 using sieve of Eratosthenes.
For each a[i]
bool check_if_prime=1;
For all prime <= sqrt(a[i])
if a[i] % prime[i] == 0 {
store prime[i]
check_if_prime=0
}
if check_if_prime
store a[i] // a[i] is prime since it has no prime factor <= sqrt(n)
Print all the stored prime[i]'s
は、この問題へのより良いアプローチはありますか?
私は、問題へのリンクを掲載しています:私のコードは、いくつかの最適化を必要とダニエル・フィッシャーによって示唆されるように
:私のコードに
http://www.spoj.pl/problems/MAIN12B/
リンク: http://pastebin.com/R8TMYxNz
ソリューションより速いふるいといくつかの小さな修正のように。これらすべての変更を行った後、私は問題を解決することができます。これは、1.05秒かかったSPOJの私の受け入れコードです:ケースで
#include<iostream>
#include<cstdio>
#include<map>
#include<bitset>
using namespace std;
#define max 1000000
bitset <max+1> p;
int size;
int prime[79000];
void sieve(){
size=0;
long long i,j;
p.set(0,1);
p.set(1,1);
prime[size++]=2;
for(i=3;i<max+1;i=i+2){
if(!p.test(i)){
prime[size++]=i;
for(j=i;j*i<max+1;j++){
p.set(j*i,1);
}
}
}
}
int main()
{
sieve();
int t;
scanf("%d", &t);
for (int w = 0; w < t; w++){
int n;
scanf("%d", &n);
long long a[n];
for (int i = 0; i < n; i++)
scanf("%lld", &a[i]);
map < long long, int > m;
map < long long, int > ::iterator it;
for (int i = 0; i < n; i++){
long long num = a[i];
long long pp;
for (int j = 0; (j < size) && ((pp = prime[j]) * pp <= num); j++){
int c = 0;
for (; !(num % pp); num /= pp)
c = 1;
if (c)
m[pp] = 1;
}
if ((num > 0) && (num != 1)){
m[num] = 1;
}
}
printf("Case #%d: %d\n", w + 1, m.size());
for (it = m.begin(); it != m.end(); it++){
printf("%lld\n", (*it).first);
}
}
return 0;
}
を、誰もがより良い方法や、いくつかのより高速な方法でそれを行うことができるである、私に知らせてください。
あなたのC++プログラムと私のCプログラムの結果は非常に似ていると思います。 8回の鉱山からのユーザー時間は、0.204 + 0.209 + 0.207 + 0.206 + 0.208 + 0.209 + 0.206 + 0.208 = 1.657sであり、あなたの8回の実行は0.208 + 0.210 + 0.209 + 0.211 + 0.209 + 0.209 + 0.212 + 0.212 = 1.68秒。どちらも-03でコンパイルされました。私は1回5回実行し、最初の実行を破棄して(キャッシュがウォームアップしている間)、もう一方を実行して、最初の実行を破棄してから、もう一度実行しました。システムとリアルも同様でした。テストデータは999962000357 =(999979 * 999983、1000000未満の最高2つの素数)の100でした。 Mac Core 2 Duo 2.16MHz。 HTH – gbulmer