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;
}