codeforces 992B Nastya Studies Informatics 【暴力】
题目大意,给你区间[l,r]和x,y 问你区间中有多少个数对 (a,b) 使得 gcd(a,b)=x lcm(a,b)=y
a,b交换位置就是不同的数对
and
题目分析,根据lcm(最小公倍数) 的定义 y=a*b/x;
也就是说
那么 ,我们发现a,b一定为Y的因数,所以我们枚举y的每个因子就可以,我们只要用log(y)的复杂度暴力算每一个因数就可以
然后对于每个因子当做a,
b=x*y/a;
然后判断a,b是否在区间内,gcd(a,b)是否为x
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+50;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
typedef long long ll;
ll l,r,x,y;
ll ans=0;
void check(ll a)
{
ll b = x*y/a;
//cout<<a<<" "<<b<<endl;
if(a<l||a>r)return;
if(b<l||b>r)return;
if(__gcd(a,b)!=x)return;
// cout<<a<<" "<<b<<endl;
ans+=1;
}
int main()
{
scanf("%I64d%I64d%I64d%I64d",&l,&r,&x,&y);
for(ll i=1;i*i<=y;i++)
{
if(y%i==0)
{
ll p = y / i;
check(i);
if(p!=i)
{
check(p);
}
}
}
//if(x==y) check(y);
printf("%I64d\n",ans);
return 0;
}