题解:P1072 [NOIP2009 提高组] Hankson 的趣味题

呃呃呃,考完 csp 第一次在 luogu 上写题解。

题意

给予四个整数 a,b,c,d,求满足 gcd(a,x)=b,lcm(c,x)=d 的正整数 x 的个数。

思路

对于条件一,x 的范围过于宽泛,难道你要扫描 b 的所有倍数吗?

所以我可以将 x 的大致范围锁定在条件二中,即 xd 的约数。

锁定 d 的所有约数只需要 O(d) 的复杂度。

具体的来说,所有约数,除 d 以外,都是成对出现的,若有一个约数是 i,则必有另一个为 d/i

所以,我们只需要扫描 1d 即可,每扫描到一个约数 i,将 id/i 放入放约数的数组(d 除外,特判一下)。

谨记:1 也要扫描,题目中没要排除 1

然后将扫描出来的约数每一个判断一下是否满足题目中的条件即可。

AC Code

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int gcd(int a,int b){ return b ? gcd(b,a%b) : a;} 
int lcm(int a,int b){return a*b/gcd(a,b);} 
int a,b,c,d,ans;
int primes[N],p,t;
void solve(){
	p=0,ans=0;
	cin>>a>>b>>c>>d;
	for(int i=1;i<=sqrt(d);i++)if(d%i==0&&i*i!=d)primes[++p]=i,primes[++p]=d/i; else if(d%i==0)primes[++p]=i;//码风不好,请谅解一下。
	for(int i=1;i<=p;i++){
		if(primes[i]*c==d*gcd(primes[i],c)&&gcd(a,primes[i])==b){
			++ans;
		}
	}
	cout<<ans<<"\n";
}
int main(){
	cin>>t;
	while(t--)solve();
	return 0;
}
posted @   All_Unluck_Beginning  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示