题解 | Hankson 的趣味题
2025-12-07 14:00:12
发布于:江苏
102阅读
0回复
0点赞
题目大意
求出一个正整数 满足 且 。
解题思路
首先想到的是直接枚举 ,如果满足要求则累加答案,因为 一定不满足 ,所以 从 一直枚举到 。代码如下:
#include<iostream>
#include<math.h>
#define ll long long
using namespace std;
ll n,a0,a1,b0,b1,ans;
ll gcd(ll x,ll y){
return (y==0?x:gcd(y,x%y));
}
ll lcm(ll x,ll y){
return (x/gcd(x,y)*y);
}
int main(){
cin>>n;
while(n--){
cin>>a0>>a1>>b0>>b1;
ans=0;
for(ll i=1;i<=b1;++i){
if(gcd(i,a0)==a1&&lcm(i,b0)==b1)++ans;
}
cout<<ans<<endl;
}
return 0;
}
时间复杂度 ,只适用于 的数据,需要再优化。
优化思路
因为 的前提条件是 ,即 是 的因数,枚举 的因数的时间复杂度是 ,再判断是否满足 和 的条件即可,时间复杂度 。
参考代码
#include<iostream>
#include<math.h>
#define ll long long
using namespace std;
ll n,a0,a1,b0,b1,ans;
ll gcd(ll x,ll y){
return (y==0?x:gcd(y,x%y));
}
ll lcm(ll x,ll y){
return (x/gcd(x,y)*y);
}
int main(){
cin>>n;
while(n--){
cin>>a0>>a1>>b0>>b1;
ans=0;
for(ll i=1;i<=sqrt(b1);++i){
if(b1%i==0){
if(gcd(i,a0)==a1&&lcm(i,b0)==b1)++ans;
int j=b1/i;
if(i!=j){
if(gcd(j,a0)==a1&&lcm(j,b0)==b1)++ans;
}
}
}
cout<<ans<<endl;
}
return 0;
}
这里空空如也





有帮助,赞一个