蒟蒻求助

P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题

Sun13 @ 2024-07-22 13:19:09

第6和第10个点的TLE烦死了

#include<bits/stdc++.h>
using namespace std;
long long a,b,sum=0;
long long gcd(long long a,long long b){
    if(b==0) return a;
    return gcd(b,a%b);
}
int main(){
    scanf("%lld%lld",&a,&b);
    for(long long n=1; n<=a*b; n++){
        long long m=a*b/n;
        if(n*m!=a*b) continue;
        long long x=gcd(n,m),y=n*m/x;
        if(x==a&&y==b) sum++;
    }
    printf("%d\n",sum);
    return 0;
}

谁有更好的方法吗?


by CheeseFunction @ 2024-07-22 13:26:11

你可以试一试STL中的__gcd(int x,int y)函数,其返回值为xy的最大公因数


by __Nebula__ @ 2024-07-22 13:26:21

枚举到根号(a*b)就可以了


by __Nebula__ @ 2024-07-22 13:28:52

#include<bits/stdc++.h>
using namespace std;
inline int gcd(int x, int y){
    if(y == 0) return x;
    return gcd(y, x % y);
}
long long a,b,c,d,e,f,ans; 
int main()
{
    scanf("%lld %lld",&a,&b);
    for(int i=1;i<=sqrt(a*b);i++)
    {
        if(a*b%i==0&&gcd(i,a*b/i)==a) 
        {
            ans++;
        }
   }
    if(a==b)
    {
        printf("%d",ans);
    }
    else
    {
        printf("%d",ans*2);
    }
   return 0;
}

by xiao_qiu @ 2024-07-22 13:47:35

@jizhiyinnitaimei 最好是把sqrt函数放在外面,省一点调用时间,设个变量就行了


by __Nebula__ @ 2024-07-22 13:55:56

@xiao_qiu 谢谢指点


|