Как найти LCM для {1, 2, ..., n}, где 0 ‹ n ‹ < strong>10001 самым быстрым способом. Один из способов — вычислить n! / gcd (1,2,.....,n), но это может быть медленным, так как число тестовых случаев равно t ‹ 501 и >вывод должен быть LCM ( n! ) % 1000000007
Код для того же:
#include<bits/stdc++.h>
using namespace std;
#define p 1000000007;
int fact[10001] = {1};
int gcd[10001] = {1};
int main()
{
int i, j;
for( i = 2;i < 10001; i++){
fact[i] = ( i * fact[i-1]) % p;
}
for(i=2 ;i < 10001; i++){
gcd[i] =__gcd( gcd[i-1], i );
}
int t;
cin >> t;
while( t-- ) {
int n;
cin >> n;
int res = ( fact[n] / gcd[n] );
cout << res << endl;
}
return 0;
}
Но этот код также не работает. Почему?
lcm(a, b) * gcd(a, b) = a * b
действительно только для двух чисел. Это неправильно для большего количества входных параметров. lcm и gcd имеют разложение на простые множители с максимальным и минимальным показателями соответственно, тогда как произведение их суммирует. Иsum(e1, e2, ...) - min(e1, e2, ...) != max(e1, e2, ...)
. - person Nico Schertler   schedule 30.05.2015