我必须找到n个数字的LCM MODULO 10 ^ 9 + 7。我的方法是找到两个数字的LCM,然后对它们进行MOD。然后取下一个元素的LCM和从上一次迭代中获得的答案并对其进行MOD。这样做是为了所有元素。错了吗?
问问题
5511 次
2 回答
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 下。
于 2014-07-05T15:26:36.040 回答
2
仅供将来参考,这是一个不使用素数分解的 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;
}
于 2015-06-07T20:53:54.007 回答