题目链接
题意:要你在【l,r】内找出一对整数a和b的数量,要求gcd(a,b)=x,lcm(a,b)=y。
思路:首先y%x!=0的肯定为0,设a=xc,b=xd(c和d互质),所以lcm=xcxd,所以lcm肯定是gcd的倍数,然后的话如果直接在【l,r】内枚举的话会T,考验你剪枝优化的时候到了,我们可以把上面那个式子整理一下,xy=ab=xcxd,最后可以变成y/x=cd=a/xb/x,所以我们可以在根号(y/x)的范围内枚举c,判断一下c和d是否互质同时是否在边界l,r内就可以了。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll x,y;
bool check(ll a,ll b,ll l,ll r)
{
return __gcd(a,b)==1&&a*x>=l&&b*x>=l&&a*x<=r&&b*x<=r;
}
int main()
{
ll l,r,ans=0;
cin>>l>>r>>x>>y;
if(y%x!=0){
printf("0");return 0;
}
y/=x;
for(ll i=max(l/x,1LL*1);i<=sqrt(y)&&i<=r/x;++i)
{
if(y%i==0&&check(i,y/i,l,r)) ans+=((i==y/i)?1:2);
}
printf("%lld\n",ans);
}