zoukankan      html  css  js  c++  java
  • 洛谷

    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;
        }
    }
    
  • 相关阅读:
    easyExcel入门
    UML-从需求到设计--迭代进化
    UML-操作契约总结
    102. Binary Tree Level Order Traversal
    98. Validate Binary Search Tree
    95. Unique Binary Search Trees II
    96. Unique Binary Search Trees
    94. Binary Tree Inorder Traversal
    84. Largest Rectangle in Histogram
    92. Reverse Linked List II
  • 原文地址:https://www.cnblogs.com/Yinku/p/10673128.html
Copyright © 2011-2022 走看看