codevs 1172 Hankson 的趣味题

Posted on 2016-08-06 16:34  ziliuziliu  阅读(128)  评论(0编辑  收藏  举报

woc....这题考细节处理。要注意代码的逻辑顺序还有不要作死地循环到sqrt+1。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int t,a0,a1,b0,b1;
int gcd(int a,int b) 
{
    if(b==0) return a; 
    return gcd(b,a%b);
} 
void work()
{
    scanf("%d%d%d%d",&a0,&a1,&b0,&b1);
    int r1=a0%a1,r2=b1%b0;
    if ((a0%a1!=0) || (b1%b0!=0)) printf("0\n");
    else
    {
        int a,b,c,d,cnt=0;
        b=a0/a1;c=b1/b0;
        int up=sqrt(b1);
        for (int i=1;i<=up;i++)
        {
            if (b1%i==0)
            {
                int x=i;
                if ((gcd(x/a1,b)==1) && (gcd(c,b1/x)==1) && (x%a1==0))
                    cnt++;
                x=b1/x;
                if ((gcd(x/a1,b)==1) && (gcd(c,b1/x)==1) && (x%a1==0) && (x!=i))
                    cnt++;
            }
        }
        printf("%d\n",cnt);
    }
}
int main()
{
    scanf("%d",&t);
    for (int i=1;i<=t;i++)
        work();
    return 0;
}