求助大佬,50分,4个点TLE,1个点WA

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

hhhh2971 @ 2023-08-31 10:15:49

#include<bits/stdc++.h>
using namespace std;

bool maxgcd(int x,int y,int p)
{
    int ans;
    for (int i=1;i<=min(x,y);i++)
        if (x%i==0 && y%i==0) ans=i;
    if (ans==p) return true;
    return false;
}

bool minlcm(int x,int y,int p)
{
    for (int i=max(x,y);true;i=i+max(x,y))
        if (i%x==0 && i%y==0)
        {
            if (i==p) return true;
            return false;
        }
}

int main()
{
    int x,y;
    int sum=0;
    int cur=0;
    cin >> x >> y;
    for (int i=x;i<y;i++)
        for (int j=i+1;j<=y;j++)
            if (maxgcd(i,j,x) && minlcm(i,j,y) && i!=j)
            {
                //cout << "&&&" << i << " " << j << endl;
                sum++;
            }
    cout << sum*2-cur << endl;

    return 0;
}

by jiangzining @ 2023-09-10 19:05:54

a和b的最小公倍数=a*b/a和b的最大公约数,30层的第二层循环可以不要,然后把j替换成a乘b除i。


by jiangzining @ 2023-09-10 19:21:38

判断函数可以使用gcd函数


by jiangzining @ 2023-09-10 19:27:31

我的代码:

#include<iostream>
#include<cmath>
using namespace std;
int m,n,ans,flag;
long long gcd(long long x,long long y){
    if(y==0){
        return x;
    }
    return gcd(y,x%y);
}
int main(){
    cin>>n>>m;
    for(long long i=1;i<=sqrt(1*m*n);i++){
        if((n*m)%i==0&&gcd(i,(n*m)/i)==n){
            ans++;
            if(i*i==n*m){
                flag=1;
            }
        }
    }
    cout<<ans*2-flag;
    return 0;
}

by hhhh2971 @ 2024-08-05 10:53:28

@jiangzining 谢谢大佬,我之前没看见,太抱歉了


|