Hankson的趣味题

题目链接:https://www.acwing.com/problem/content/202/

 

思路:由于x是b1的约数,所以x的质因子一定也是b1的质因子,

          我们可以对b1的每个质因子p,分别计算a0,a1,b0,b1分别

         包含多少个p.然后讨论x可能含有几个p即可

#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int a[100005],b[100005];
int main()
{
    int k=0;
    for(int i=2; i<=100000; i++)
    {
        if(b[i]==0)
        {
            a[++k]=i;
            for(int j=i; j<=100000/i; j++)
                b[j*i]=1;
        }
    }
    int t,n,x0,x1,y0,y1;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d %d %d %d",&x0,&x1,&y0,&y1);
        int ans=1;
        for(int i=1; i<=k; i++)
        {
            int s=0;
            if(y1==1)
                break;
            if(y1%a[i]==0)
            {
                while(y1%a[i]==0)
                {
                    s++;
                    y1=y1/a[i];
                }
                int u1=0,u2=0,u3=0;
                while(x0%a[i]==0)
                {
                    x0=x0/a[i];
                    u1++;
                }
                while(x1%a[i]==0)
                {
                    x1=x1/a[i];
                    u2++;
                }
                while(y0%a[i]==0)
                {
                    y0=y0/a[i];
                    u3++;
                }
                if(u1==u2&&u3<s&&s<u1)
                {
                    ans=0;
                    y1=1;
                    break;
                }
                else if(u1==u2&&u3==s)
                {
                    if(s<u1)
                    {
                        y1=1;
                        ans=0;
                        break;
                    }
                    else
                    {
                        ans=ans*(s-u1+1);
                    }
                }
                else if(u1>u2&&u3<s&&s!=u2)
                {
                    ans=0;
                    y1=1;
                    break;
                }
                else if(u1>u2&&u3==s&&u2>s)
                {
                    ans=0;
                    y1=1;
                    break;
                }
            }
        }
        if(y1>1)
        {
            if(y0==y1&&x1==1)
                ans=ans*2;
            else if(x1!=1)
                ans=0;
        }
        printf("%d\n",ans);
    }
}

  

;

posted @ 2019-08-13 21:38  ~zcb  阅读(408)  评论(0编辑  收藏  举报