求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);