区间合数的最小公倍数(质数+因数分解)

Posted MangataTS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区间合数的最小公倍数(质数+因数分解)相关的知识,希望对你有一定的参考价值。

题目链接

https://ac.nowcoder.com/acm/contest/23479/J

题面

思路

对于多个数的最小公倍数,我们可以通过唯一分解定理将每个合数进行拆分,然后统计每个质因子的数量,对于每一个质因子数量我们取到最大即可,换句话说也就是统计区间内合数的唯一分解后的每一个质因子数量最多的质因子,然后最后将这些质因子乘起来
例如, a = 2 3 ∗ 3 5 ∗ 5 1 a=2^3*3^5*5^1 a=233551 b = 2 4 ∗ 3 1 ∗ 5 2 b=2^4*3^1*5^2 b=243152 ,那么它们的最小公倍数就是 2 4 ∗ 3 5 ∗ 5 2 2^4*3^5*5^2 243552 ,也就是每个素数的幂取最大值。

详情请看代码

代码

#include<bits/stdc++.h>
using namespace std;
//----------------自定义部分----------------
#define ll long long
#define mod 1000000007
#define endl "\\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3f

int dx[4] = -1, 0, 1, 0, dy[4] = 0, 1, 0, -1;

ll ksm(ll a,ll b) 
	ll ans = 1;
	for(;b;b>>=1LL) 
		if(b & 1) ans = ans * a % mod;
		a = a * a % mod;
	
	return ans;

ll inv(ll x)
	return ksm(x,mod-2);

ll quick_pow2(ll x, ll n) 
	ll res = 0;
	x%= mod;
	n%= mod;
	while(n) 
		if(n & 1) 
			res = (res + x) % mod;
		
		x = (x%mod + x%mod) % mod;
		n >>= 1;
	
	return res%mod;
 

ll lowbit(ll x)return -x & x;

const int N = 2e6+10;
//----------------自定义部分----------------
ll l,r;

bool is_prime(ll x)
	if(x == 1LL || x == 0LL) return true;
	for(ll i = 2LL;i * i <= x; ++i) 
		if(x % i == 0LL) return false;
	
	return true;

vector<ll> V;
ll cnt[N];

void slove(ll x)
	
	for(ll i = 2;i * i <= x; ++i) 
		ll res = 0;
		while(x % i == 0) 
			res ++;
			x /= i;
		
		cnt[i] = max(cnt[i],res);
	
	cnt[x] = max(cnt[x],1LL);


int main()

	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	std::cout.tie(nullptr);
	cin>>l>>r;
	while(l <= r)
		if(!is_prime(l)) break;
		l++;
	
	if(l > r) 
		cout<<-1<<endl;
		return 0;
	
	
	ll gcd = 0;
	for(ll i = l;i <= r; ++i) 
		if(!is_prime(i))
			slove(i);
		
	
	ll ans = 1LL;
	for(int i = 1;i <= 30000; ++i) 
		for(int j = 1;j <= cnt[i]; ++j) 
			ans = (ans * i) % mod;
		
	
	cout<<ans<<endl;
	
	
	return 0;

以上是关于区间合数的最小公倍数(质数+因数分解)的主要内容,如果未能解决你的问题,请参考以下文章

BASIC-16 | 分解质因数

Python3 分解质因数

约数之和

uestc summer training #2

分解质因数

经典算法详解(12)分解质因数