n个数的最小公倍数

求解n个数的最小公倍数
①公式a1*a2*..an=lcm(a1,a2..an)*gcd(a1,a2,..,an)
②对所有数分解质因子,统计所有质因子出现的最高的幂,将这些最高幂的质因子全部相乘就是答案。例如,a=2^3*3^5*5^1,b=2^4*3^1*5^2,则lcm(a,b)=2^4*3^5*5^2。

题目:区间合数的最小公倍数

n个数的最小公倍数思路:先用欧拉筛素数把合数筛出来,然后用方法1。注意这道题不能用逆元(不能用公式),因为公因数可能会大于mod,不互质,不存在逆元。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e4+10,mod=1e9+7;
int prime[N],st[N],cnt;
int l,r;
map<int,int> mp;
void getPrime(int r)
{
	for(int i=2;i<=r;i++)
	{
		if(!st[i])
		{
			prime[cnt++]=i;
			for(int j=i+i;j<=r;j+=i)
				st[j]=true;
		}
	}
}
int qmi(int a,int k,int p)
{
    int res=1;
    while(k)
    {
        if(k&1) res=(ll)res*a%p;
        a=(ll)a*a%p;
        k>>=1;
    }
    return res;
}
void devide(int x)
{
	for(int i=2;i<=x/i;i++)//枚举到sqrt(x)即可,因为一个数最多只有一个大于sqrt(x)的因子
	{
		if(x%i==0)
		{
			int s=0;
			while(x%i==0)
			{
				x/=i;//i是分解出的质因数
				s++;//每个质因数的指数
			}
            if(!mp[i]||mp[i]<s)
                mp[i]=s;
		}
	}
	if(x>1)
    {
		if(!mp[x])
              mp[x]=1;
    }
}
int main()
{
    cin>>l>>r;
    getPrime(r);
    ll res=1;
    bool flag=false;
    for(int i=l;i<=r;i++)
    {
        if(i!=1&&st[i])
        {
            flag=true;
            devide(i);
        }
    }
   for(auto iter=mp.begin();iter!=mp.end();iter++)
   {
       res=res*qmi(iter->first,iter->second,mod)%mod;
   }
    if(flag)
        cout<<res<<endl;
    else
        cout<<-1<<endl;
   return 0;
}

上一篇:习题10-1 判断满足条件的三位数 (15 分)


下一篇:试题 基础练习 高精度加法