0
点赞
收藏
分享

微信扫一扫

Hanson的趣味题

霸姨 2022-03-12 阅读 35
c++

l c m ( b , x ) = d lcm(b,x)=d lcm(b,x)=d可知 x x x一定整除 d d d,即 x x x一定是 d d d的约束。通过试除法,我们可以在 O ( N ) O(\sqrt{N}) O(N )内求出所有 d d d的约数,逐一判断是否满足题意即可。
总时间复杂度 O ( n N l o g ( d ) ) O(n\sqrt{N}log(d)) O(nN log(d))

// luogu-judger-enable-o2
#include <iostream>
using namespace std;
long long n;
long long a,b,c,d;
int tot;
long long ans[200010];
void pri(long long n)
{
    for(int i = 1;i*i <= n;i ++ )
    {
        if(!(n % i)) 
        {ans[ ++ tot] = i;
        if(n / i != i) ans[ ++ tot] = n / i;}
    }
}
long long gcd(long long a, long long b)
{
    return b ? gcd(b, a % b) : a; 
}
long long lcm(long long a, long long b)
{
    return a * b / gcd(a, b);
}
int nod;
int main()
{
    cin >> n;
    while(n -- ){
        tot = 0;
        cin >> a >> c >> b >> d;
        pri(d);
        nod = 0;
        for(int i = 1;i <= tot; i ++ ){
            if(gcd(ans[i], a) == c && lcm(ans[i], b) == d){
                nod ++ ;	
            }
        }
        cout << nod << endl;
    }
}
举报

相关推荐

0 条评论