求n个数的最小公倍数

解决的问题:

对于一个长度为n序列ai,求ai的最小公倍数

 

解析:

我们知道,如果求两个数a,b的LCM=a*b/gcd(a,b),多个数我们可以两两求LCM,再合并,这样会爆long long

 

所以这里我们用到了质因数分解法:

1.我们首先明确,他们的LCM是把每一个ai质因数分解之后,他们与其他ai的公共部分乘上自身特有的部分,即每一个质因子在ai中出现次数的最大值,是他们LCM的每一个质因子的出现次数t[i].

2.所以我们将t[i]求解出即可相乘乘出LCM,这里只有乘法,可以取模.

 

实现代码如下:

 

 1     for(int i=1;i<=m;i++){
 2         lim=sqrt(c[i]);
 3         tmp=c[i];                              //c[i]即上述的a[i]
 4         for(int j=1;j<=num && pri[j]<=lim;j++){//pri为已经筛选好的质数
 5             if(tmp%pri[j])continue;
 6             cnt=0;
 7             while(tmp%pri[j]==0)tmp/=pri[j],cnt++;
 8             t[pri[j]]=max(t[pri[j]],cnt);
 9         }
10         if(tmp>1)t[tmp]=max(t[tmp],1);
11     }
12     ll ans=1;
13     for(int i=1;i<=num;i++)       //最后求出的t[i]即为LCM每一个质因子出现的次数
14         for(int j=1,tmp=t[pri[i]];j<=tmp;j++)
15             ans*=pri[i],ans%=mod;
16     printf("%lld\n",ans);

 

posted @ 2017-08-10 22:17  PIPIBoss  阅读(1171)  评论(0编辑  收藏  举报