P1072 Hankson 的趣味题 - 约数

这只是暴力算法
给定四个参数a0,a1,b0,b1,求满足\(gcd(x, a0) = a1且lcm(x,b0)=b1\)的x的个数
由lcm这个条件可确定x的上界,找b1的约数,每个都判断一下是否符合上述两个条件
我我我又爆int了

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <cmath>
using namespace std;
#define debug(x) cerr << #x << "=" << x << endl;
const int MAXN = 100000 + 10;
const int INF = 1 << 30;
typedef long long ll;
ll n,m,now,ans,a0,a1,b0,b1,tot;
ll num[MAXN];
void div(int x) {
	int rt_x = sqrt((double)x);
	for(int i=1; i <= rt_x; i++) {
		if(x % i == 0) {
			num[++tot] = i;
			if(x / i != i) num[++tot] = x / i;
		} 
	}
}
ll gcd(int a, int b) {
	return b ? gcd(b, a % b) : a;
}
ll lcm(int a, int b) {
	ll k = (ll)a * b;
	return k / gcd(a, b);
}
int main() {
	scanf("%d", &n);
	while(n--) {
		tot = 0, ans = 0;
		scanf("%lld%lld%lld%lld", &a0, &a1, &b0, &b1);
		div(b1);
		for(int i=1; i<=tot; i++) {
			if(gcd(num[i], a0) == a1 && lcm(num[i], b0) == b1) ans++;
		}
		printf("%lld\n", ans);
	}
	return 0;
}
posted @ 2018-10-29 21:49  Zolrk  阅读(149)  评论(0编辑  收藏  举报