C++解决Hanks趣味问题

Hanks博士是BT(Bio-Tech,生物技术)领域的知名专家,他的儿子名叫Hankson。现在,刚刚放学回家的Hankson正在思考一个有趣的问题。今天在课堂上,老师讲解了如何求两个正整数c1和c2的最大公约数和最小公倍数。现在Hankson认为自己已经熟练地掌握了这些知识,他开始思考一个“求公约数”和“求公倍数”之类问题的“逆问题”,这个问题是这样的:已知正整数a0,a1,b0,b1,设某未知正整数x满足:1、 x和a0的最大公约数是a1;2、 x和b0的最小公倍数是b1。Hankson的“逆问题”就是求出满足条件的正整数x。但稍加思索之后,他发现这样的x并不唯一,甚至可能不存在。因此他转而开始考虑如何求解满足条件的x的个数。请你帮助他编程求解这个问题。输入格式 输入第一行为一个正整数n,表示有n组输入数据。接下来的n行每行一组输入数据,为四个正整数a0,a1,b0,b1,每两个整数之间用一个空格隔开。输入数据保证a0能被a1整除,b1能被b0整除。输出格式输出共n行。每组输入数据的输出结果占一行,为一个整数。对于每组数据:若不存在这样的x,请输出0;若存在这样的x,请输出满足条件的x的个数;样例输入2 41 1 96 288 95 1 37 1776样例输出6 2。

程序实现:

//Hanks趣味问题
//WANTING WANG
//2019.03 
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int a0,a1,b0,b1;short n,ans;
inline int gcd(int a,int b){return !b?a:gcd(b,a%b);}
inline int t()
{
    char ch=getchar();int k=0;
    while(ch<'0'||ch>'9') ch=getchar();
    while(ch<='9'&&ch>='0') k=k*10+ch-'0',ch=getchar();
    return k;
}
inline void P( int n)
{
    if(n>9) P(n/10);
    putchar(n%10+'0');
    return ;
}
int main()
{
    n=t();
    while(n--)
    {
        a0=t();a1=t();b0=t();b1=t();
        ans=0;
        for(int i=1;i<=sqrt(b1);i++)
        {
            if(b1%i==0)
            {
                if(i%a1==0&&gcd(i/a1,a0/a1)==1&&gcd(b1/i,b1/b0)==1) 
                ans++;
            }
            int ii=b1/i;
            if(b1%ii==0&&ii!=i&&ii%a1==0&&gcd(ii/a1,a0/a1)==1&&gcd(b1/ii,b1/b0)==1) 
            ans++;
        }
        P(ans);putchar('\n');
    }
    return 0;
}

调试:C++解决Hanks趣味问题

测试:
C++解决Hanks趣味问题