已退役


私信TA

用户名:15893197790

访问量:14398

签 名:

努力学习,积极生活。

等  级
排  名 389
经  验 5119
参赛次数 0
文章发表 43
年  龄 0
在职情况 学生
学  校 南京大学
专  业 计算机科学与技术

  自我简介:

已退役。研究生方向为AI+软件工程,欢迎学术交流!

解题思路:把4个数都变成:质因数1^x1*质因数2^x2*质因数3^x3...然后进行讨论即可,对于同一个底数,假设4个数对应的指数(可以为0)分别为a,b,c,d。令x的指                    数为e

                令ret=1

                那么当b>d时,显然不成立,因为b<=e<=d,返回0

                当b=d时,e只能取b,ret*=1;

                当b<d时:当a!=b&&c!=d时,e既要取b又要取d,不成立,返回0

                                 当a!=b||c!=d时(由于上一个的限制,到这里时显然或运算两边不同时成立),e取b或d,ret*=1

                                 当a==b&&c==d时,e在b和d间随便取,ret*=d-b+1

注意事项:

参考代码:

#include<bits/stdc++.h>

using namespace std;

#define maxn 2010

typedef long long ll;

int n;

ll a0[maxn],a1[maxn],b0[maxn],b1[maxn];

int ans[maxn];

unordered_map<ll,int> ys[5];//key是a0(或a1,b0,b1)的质因数,val是a0(或a1,b0,b1)的对应质因数的指数

//a0,a1,b0,b1分别对应ys[1],ys[2],ys[3],ys[4]

vector<ll> primefactor;//所有出现过的质因数,1不是质因数,没有任何影响

void fenjie(ll x,int index){//分解质因数

    int tmp;

    for(ll i=2;i<=x/i;i++){

        if(x%i==0){

            tmp=0;

            while(x%i==0){

                x/=i;

                tmp++;

            }

            ys[index][i]=tmp;

            if(find(primefactor.begin(),primefactor.end(),i)==primefactor.end()){

                primefactor.push_back(i);

            }

        }

    }

    if(x>1){

        ys[index][x]=1;

        if(find(primefactor.begin(),primefactor.end(),x)==primefactor.end()){

            primefactor.push_back(x);

        }

    }

}

int getans(ll a0,ll a1,ll b0,ll b1){

    ys[1].clear();ys[2].clear();ys[3].clear();ys[4].clear();primefactor.clear();

    fenjie(a0,1);

    fenjie(a1,2);

    fenjie(b0,3);

    fenjie(b1,4);

    for(auto v:primefactor){

        for(int i=1;i<=4;i++){

            if(ys[i].find(v)==ys[i].end()){

                ys[i][v]=0;//0次方

            }

        }

    }

    ll ret=1;

    for(auto v:primefactor){

        if(ys[2][v]>ys[4][v])return 0;

        else if(ys[2][v]==ys[4][v])continue;

        else{//ys[2][v]<ys[4][v]

            if(ys[1][v]>ys[2][v]&&ys[3][v]<ys[4][v])return 0;

            else if(ys[1][v]>ys[2][v]||ys[3][v]<ys[4][v])continue;//由于上一个else if的限制,或两边不会同时成立

            else ret*=ys[4][v]-ys[2][v]+1;//此时为ys[1][v]==ys[2][v]&&ys[3][v]==ys[4][v]

        }

    }

    return ret;

}

int main(){

    scanf("%d",&n);

    for(int i=1;i<=n;i++){

        scanf("%lld%lld%lld%lld",&a0[i],&a1[i],&b0[i],&b1[i]);

    }

    for(int i=1;i<=n;i++){

        ans[i]=getans(a0[i],a1[i],b0[i],b1[i]);

        printf("%lld\n",ans[i]);

    }

    system("pause");

    return 0;

}


 

0.0分

1 人评分

  评论区

  • «
  • »