Codeforces Round #489 (Div. 2) B. Nastya Studies Informatics(数学+枚举优化)

题目链接
在这里插入图片描述
题意:要你在【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);
}
发布了391 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42479630/article/details/105397034