emmm.....还以为会超时

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

c_yanye_w @ 2024-10-30 22:12:29

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
long long x,y,cnt,tot,d[100005];
int gcd(int a,int b)
{
    if(a<b)
    {
        int t=a;
        a=b;
        b=t;
    }
    while(b)
    {
        int t=a%b;
        a=b;
        b=t;
    }
    return a;
}
int main()
{
    scanf("%lld %lld",&x,&y);
    if(x==y)
    {
        printf("1");
        return 0;
    }
    for(int i=x;i<=y;i++)
    {
        if(i%x==0 && y%i==0)
            d[tot++]=i;
    }
    for(int i=0;i<tot;i++)
    {
        int t;
        for(int j=i;j<tot;j++)
        {
            t=gcd(d[i],d[j]);
            if(t==x && d[i]*d[j]/t==y)
                cnt+=2;
        }
    }
    printf("%lld",cnt);
    return 0;
}

by luogu_li4zi3 @ 2024-11-02 07:16:34

O((y - x)^2 \cdot \log \min(d[i], d[j]))

,很好的时间复杂度。当x=2,y=100000时,就是O(106136)$,这应该是最坏的了,不过在洛谷上应该花不了多少时间(2毫秒?)


by LionBlaze @ 2024-11-21 19:50:59

@luogu_li4zi3 O(106136) 是什么


|