• 洛谷


    https://www.luogu.org/problemnew/show/P1072

    一开始看了一看居然还想放弃了的.

    (x,a_0,a_1,b_0,b_1) 质因数分解.

    例如 (x=p_1^{alpha_1}p_2^{alpha_2}...p_k^{alpha_k})

    由gcd的性质,对应指数的最小值,直接得一组方程.

    再有lcm的性质,对应指数的最大值,再得一组方程.


    设计起来不难但是写起来就慢多bug的.

    第一次交70分,原因是质因数分解过慢!

    应该一开始记录原本待分解数n的大小cn,当枚举p*p>cn时退出并判断n是否为1.

    还有就是求两个闭区间的交集,应该定义两个量low和high,然后交集就是[maxlow,minhigh],别的都不对!

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define INF 0x3f3f3f3f
    
    int used_p[300],utop;
    
    bool check(int a0,int a1,int b0,int b1){
        utop=0;
        if(a0%a1!=0)
            return false;
        if(b1%b0!=0)
            return false;
    
    
        int pa0=a0;
        for(int p=2;p<=a0&&p*p<=pa0;p++){
            if(a0%p==0)
                used_p[utop++]=p;
            while(a0%p==0)
                a0/=p;
        }
        if(a0!=1)
            used_p[utop++]=a0;
    
        int pb1=b1;
        for(int p=2;p<=b1&&p*p<=pb1;p++){
            if(b1%p==0)
                used_p[utop++]=p;
            while(b1%p==0)
                b1/=p;
        }
        if(b1!=1)
            used_p[utop++]=b1;
    
        sort(used_p,used_p+utop);
        utop=unique(used_p,used_p+utop)-used_p;
    
        /*for(int i=0;i<utop;i++)
            printf("p=%d
    ",used_p[i]);*/
    
        return true;
    }
    
    int cnt[4][300];
    
    void prime_factorization(int a0,int a1,int b0,int b1){
        memset(cnt,0,sizeof(cnt));
        for(int i=0;i<utop;i++){
            int p=used_p[i];
            while(a0%p==0){
                cnt[0][i]++;
                a0/=p;
            }
            while(a1%p==0){
                cnt[1][i]++;
                a1/=p;
            }
            while(b0%p==0){
                cnt[2][i]++;
                b0/=p;
            }
            while(b1%p==0){
                cnt[3][i]++;
                b1/=p;
            }
        }
    }
    
    int main(){
        int T;
        scanf("%d",&T);
        while(T--){
            int a0,a1,b0,b1;
            scanf("%d%d%d%d",&a0,&a1,&b0,&b1);
    
            if(!check(a0,a1,b0,b1)){
                printf("0
    ");
                continue;
            }
    
            prime_factorization(a0,a1,b0,b1);
    
            ll ans=1;
            for(int i=0;i<utop;i++){
                int ail1=cnt[1][i],aih1=INF;
                if(cnt[1][i]<cnt[0][i]){
                    aih1=min(aih1,cnt[1][i]);
                }
    
                int ail2=-INF,aih2=cnt[3][i];
                if(cnt[3][i]>cnt[2][i]){
                    ail2=max(ail2,cnt[3][i]);
                }
    
                int l=max(ail1,ail2);
                int h=min(aih1,aih2);
    
                if(h<l){
                    ans=0;
                }
                else{
                    ans*=1ll*(h-l+1);
                }
                //printf("p=%d a[%d,%d]
    ",used_p[i],cnt[0][i],cnt[1][i]);
                //printf("p=%d b[%d,%d]
    ",used_p[i],cnt[2][i],cnt[3][i]);
                //printf("p=%d [%d,%d]
    ",used_p[i],l,h);
            }
            cout<<ans<<endl;
        }
    }
    
  • 相关阅读:
    Delphi字符串函数大全
    Jackson 工具类使用及配置指南
    Mybatis中javaType和jdbcType对应关系
    Mybatis SqlSessionTemplate 源码解析
    GridView 使用技巧【转】
    Spring JSR250注解
    表格文字不换行
    Sql 分页
    从GridView生成DataTable
    故障诊断:解惑IIS服务器无法添加映射之谜
  • 原文地址:https://www.cnblogs.com/Yinku/p/10673128.html
Copyright © 2020-2023  润新知