1 solutions

  • 1
    @ 2024-7-17 18:18:11

    思路

    如果暴力找 PPQQ,肯定会 TLE(O(n2)O(n^2)

    但是,众所(不一定)周知,最大公因数和最小公倍数与原数之间有个公式:a×b=gcd(a,b)×lcm(a,b)a \times b = gcd(a,b) \times lcm(a,b)(gcd 是最大公因数,lcm 是最小公倍数)。所以,根据这个公式,我们就可以少一个循环,变成 O(n)O(n)

    代码

    #include <bits/stdc++.h>
    #define int long long
    using namespace std;
    int cnt;
    int gcd(int x,int y){
    	if (y > x)	swap(x,y);
    	if (x % y == 0)	return y;
    	return gcd(y,x % y);
    }
    signed main(int argc, char **argv){
    	int x,y;
    	cin >> x >> y;
    	for (int i = x;i <= y;i++){
    		if ((x * y) % i == 0 && gcd(i,x * y / i) == x)	cnt++;
    	}
    	cout << cnt;
    	return 0;
    }
    

    花絮

    做的时候把 Line 6 的 xxyy 写反了,改了好久 QAQ

    • 1

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

    Information

    ID
    1123
    Time
    1000ms
    Memory
    125MiB
    Difficulty
    8
    Tags
    # Submissions
    32
    Accepted
    5
    Uploaded By