洛谷 P1029 最大公约数和最小公倍数问题

题目链接

#include
using namespace std;
//maxv=15485863,n=1000000
//maxv=1299709, n=100000
//maxv=1000003, n=78499
const int maxv=1000003;
const int n=78500;
bool check[maxv];
int primes[n],tot;
int p[n];
void get_primes(){//素数打表
	for(int i=2;i<=maxv;++i){
		if(!check[i]) primes[tot++]=i;
		for(int j=0;j>x>>y;
	if(y%x!=0) cout<<"0\n";
	else{
		y=y/x;
		get_primes();
		int cnt=0;
		int i;
		for(i=0;primes[i]<=y;++i){
			if(y%primes[i]==0)++cnt;//找到一个质因数
			while(y%primes[i]==0){//相同的质因数,相乘
				y/=primes[i];
			}
		}
		cout<

说明:  lcm\left ( a,b \right )= \frac{a*b}{gcd\left (a,b \right )},如果题目给的gcd和lcm是合法的(存在a,b, gcd(a,b)==x0,lcm(a,b)==y0),那么,lcm可以进行质因数分解,且一定有一个因数是gcd。lcm除以gcd后,再进行质因数分解,相同的质因数要先相乘,因为a,b除了它们的最大公因数以外没有相同的因数,这样一共得到cnt个不同的因数,对它们进行组合,有2^{^{cnt}}种可能(每个质因数有两种可能:取或不取)。

你可能感兴趣的:(数论,洛谷)