洛谷

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;
    }
}
原文地址:https://www.cnblogs.com/Yinku/p/10673128.html