样例
输入数据 1
3 60
输出数据 1
4
分析:
这道题关键都是判断最大公约数和最小公倍数,寒假时候也是讲过这方面的课的
我们循环可以直接从最大公约数p开始,因为要想是最大公约数,那么它最小也要是那个数
看例子我们可以看出,它刚好是对半的,那么就可以直接从p,一直枚举到 sqrt(p*a)
最后个数直接乘2就🆗了
但是要注意的是,我们需要特判一下:当 p==a 时 ,总数总是为1
但是我们已经把总数乘以2了,那么这时候就需要减一,或是直接令总数为1
完整代码如下:
#include<bits/stdc++.h>
using namespace std;
int p,a;
int gcd (int a, int b){ // 最大公约数
return b == 0 ? a : gcd(b, a%b);
}
//最小公倍数:
//两个数的乘积=这两个数的最大公约数 ×这两个数的最小公倍数
int main(){
cin>>p>>a;
long long ans=0;
for(int i=p;i<=sqrt(p*a);i++)
if( gcd(i,p*a/i)==p && p*a%i==0)
ans++;
ans*=2;
if(p==a)
ans--;
cout<<ans;
return 0;
}