n数的LCM模数为1000000007

时间:2014-07-04 12:25:58

标签: math lcm

我必须找到n个MODULO 10 ^ 9 + 7的LCM。我的方法是找到两个数字的LCM然后MOD它们。然后取下一个元素的LCM和从前一个迭代得到的答案和MOD它们。为所有元素执行此操作。这是错的吗?

2 个答案:

答案 0 :(得分:3)

是的,这是错的。我一直在研究类似的问题。

您必须熟悉MOD的以下属性:

属性1:(a * b * c * d ... * p * q)%MOD =(a%MOD)(b%MOD)(c%MOD) ..... (q%MOD);

但LCM并非如此。

LCM(A,B)= A * B / GCD(A,B)。

LCM(LCM(A,B),C)= LCM(A,B)* C / GCD(LCM(A,B),C)。

每当LCM变得大于MOD时,上述属性就会被破坏。您必须尝试根据分子中不同数字的产品找到LCM。

这可以通过分解所有数字并保持各种因素的最高权力记录来完成。

LCM =(2 ^ a)(3 ^ b) ....现在,您可以轻松地将它们相乘,并使用属性1保持MOD下的限制。

答案 1 :(得分:0)

仅供将来参考,这里是一个不使用素数分解的C ++实现。

  

一种可能的解决方案是为答案保留一系列因素。   每个因子将是1..N中的每个数字除以GCD(数字,[全部]   以前的数字])。为此,您必须编写一个特殊的GCD代码   计算单个数字和数组之间的结果   因素。这个C ++代码显示了它的工作原理:

#include <iostream>
#include <vector>
#define lli long long int
using namespace std;

vector<lli> T;

lli gcd(lli a, lli b) {
    if(b == 0) 
        return a;
    return gcd(b, a%b);
}

lli gcd_vector(vector<lli>& a, lli b) {
    lli ma = 1;
    for(int i=0; i<T.size(); i++)
        ma = ma*T[i]%b;
    return gcd(b, ma);
}

int main() {
    lli answer = 1;
    for(int i=1; i<=1000; i++) {
        lli factor = i/gcd_vector(T, i); 
        T.push_back(factor);
        answer = (answer*factor)%1000000007;
    }

    cout << answer << endl;
}