• P1072 Hankson的趣味题


    Solution ((90\%))

    注意到(operatorname{lcm}(b_0,x) = b_1),所以(x mid b_1),枚举(b_1)的所有约数并暴力计算。
    时间复杂度(mathcal{O}(n sqrt{b_1} log{b_1}))

    Solution ((100\%))

    枚举质数(p mid d_1),令(m_1)(a_0)中包含(p)因子的个数,(m_2,m_3,m_4)同理。
    进行分类讨论。

    # include <bits/stdc++.h>
    using namespace std;
    
    const int N = 1e6 + 5;
    
    int n;
    
    int ans = 1;
    int a0,a1,b0,b1;
    
    template <typename T> void read(T &x)
    {
        int w = 1;
        x = 0;
        char ch = getchar();
        while(!isdigit(ch))
        {
            if(ch == '-') w = -1;
            ch = getchar();
        }
        while(isdigit(ch))
        {
            x = x * 10 + ch - '0';
            ch = getchar();
        }
        x *= w;
        return;
    }
    
    void solve(int p)
    {
        int m1 = 0,m2 = 0,m3 = 0,m4 = 0;
        while(a0 % p == 0)
        {
            a0 /= p;
            ++m1;
        }
        while(a1 % p == 0)
        {
            a1 /= p;
            ++m2;
        }
        while(b0 % p == 0)
        {
            b0 /= p;
            ++m3;
        }
        while(b1 % p == 0)
        {
            b1 /= p;
            ++m4;
        }
        // printf("p = %d,m1 = %d,m2 = %d,m3 = %d,m4 = %d
    ",p,m1,m2,m3,m4);
        if(m1 > m2 && m3 < m4)
        {
            if(m2 != m4) ans = 0;
        }
        else if(m1 > m2 && m3 == m4) 
        {
            if(m2 > m4) ans = 0;
        }
        else if(m1 == m2 && m3 < m4) 
        {
            if(m2 > m4) ans = 0;
        }
        else if(m1 == m2 && m3 == m4)
        {
            if(m2 > m4) ans = 0;
            else ans *= (m4 - m2 + 1);
        }
        else ans = 0;
        return;
    }
    int v[N],prime[N],tot;
    
    void Get_prime(int n)
    {
        for(int i = 2; i <= n; i++)
        {
            if(v[i] == 0)
            {
                v[i] = i;
                prime[++tot] = i;
            }
            for(int j = 1; j <= tot && prime[j] * i <= n; j++)
            {
                if(prime[j] > v[i]) break;
                v[prime[j] * i] = prime[j];
            }
        }
        return;
    }
    
    int main(void)
    {
        read(n);
        Get_prime(50000);
        int _b1 = b1;
        while(n--)
        {
            ans = 1;
            read(a0),read(a1),read(b0),read(b1);
            for(int i = 1; i <= tot; i++)
            {
                if(_b1 % prime[i] == 0) solve(prime[i]);
                else break;
                if(ans == 0) break;
            }
            if(b1 != 1) solve(b1);
            printf("%d
    ",ans);
        }
        return 0;
    }
    
  • 相关阅读:
    utils:一个通用枚举类
    代码片段(二):SQL片段
    Scala:(一) 特点及安装环境配置
    Scala:(二) 语言基础-数据结构、表达式(判断、循环、块表达式)
    11-docker搭建mysql一主一从
    10-docker搭建rabbitmq集群
    尚硅谷周阳面试第二季
    docker 修改mysql 表大小写铭感
    volatile的理解
    消息队列优缺点及其选型
  • 原文地址:https://www.cnblogs.com/luyiming123blog/p/14668690.html
Copyright © 2020-2023  润新知