Codeforces Round #489 (Div. 2) B. Nastya Studies Informatics (数论)

原题地址:http://codeforces.com/contest/992/problem/B
题意:给出四个数字l,r,x,y.问你存在多少对(a,b) 使得gcd(a,b)=x,lcm=(a,b)=y,并且 l<=x,y<=y(并且l,r,x,y 的范围都是 1e9).

思路:一开始想法就是很显然x*y==a*b 。然后看了数据范围很明显在1秒内会T。
那么我们可以这么分析。令a=x*n,b=x*m,那么y=x*n*m,n*m=y/x.
这么计算的话,我们可以枚举n,那么复杂度就降下来了。


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll l, r, x, y;
ll gcd(ll a, ll b) {
    return b == 0 ? a : gcd(b, a % b);
}
int main() {
    scanf("%I64d%I64d%I64d%I64d", &l, &r, &x, &y);
    ll num = y / x;
    if(num * x != y) {//如果x不能整除y,那就说明绝不会有这种情况
        printf("0\n");
        return 0;
    }
    ll ans = 0;
    for(ll i = 1; i * i <= num ; i++) {//只需要枚举到根号就行了
        ll j = num / i;
        if(gcd(i, j) == 1 && i * j == num && x * i >= l && x * j >= l && x * i <= r && x * j <= r) {
            if(i == j) ans--;
            ans += 2;
        }
    }
    printf("%I64d\n", ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/yiqzq/article/details/80738853