求解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。
题目:区间合数的最小公倍数
思路:先用欧拉筛素数把合数筛出来,然后用方法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;
}