3 条题解

  • 5
    @ 2025-7-3 13:13:24

    提供一种类似二分的做法 脑子一抽想出来的,也不知道算不算二分


    • 了解性质

    两数之积为这两数的最小公倍数最大公约数之积
    即xy=gcd(x,y)*lcm(x,y)(gcd为x,y的最大公约数,lcm为x,y的最小公倍数)

    • 确定思路

    • 题目给出了一个 l~r 的区间,我们可以通过这个区间单调性来做二分(不知道算不算)
    • 指针 l 指向开头,r 指向结尾,l 和 r 表示可能的答案,即题目中的P、Q 计算 l 和 r 的乘积,判断两数之积是否为这两数的最小公倍数和最大公约数之积:
    1. 等于, 判断 gcd( l , r ) 是否为 x , lcm( l , r ) 是否为 y, 是的话 ans++, 不要忘记无论是否,都要移动两指针
    2. 当l*r>gcd( l,r )*lcm( l,r ),说明积大了,r--;
    3. 当l*r<gcd( l,r )*lcm( l,r ),说明积小了,l++;
    4. 直到指针相交结束

    • 部分AC Code

    ll x,y,ans;
    ll gcd(ll x,ll y){
    if(y==0) return x;
    return gcd(y,x%y);
    }
    ll lcm(ll x,ll y){
    return x/gcd(x,y)*y;
    }
    int mian(){	
        ios::sync_with_stdio(false);
        cin.tie(0),cout.tie(0);
        cin>>x>>y;
        ll l=x,r=y,j=x*y;
        while(l<=r){
            int m=l*r;
            if(m>j) r--;    //积大,将数减小
       	    else if(m<j) l++;    //积小,将数增大
       	    else{
       		    if(gcd(l,r)==x && lcm(l,r)==y) ans++;
       		    l++,r--;
       	    }
        }
        cout<<ans*2;    //因子成对出现
        return 0;
    }
    
    • 3
      @ 2025-7-2 10:26:33
      using namespace std;
      typedef long long ll;
      ll gcd(ll x, ll y)
      {
      if (y==0)
      {
      return x;
      }
      return gcd(y, x % y);
      }
      
      int main()
      {
      ll x,y,cnt=0;
      cin>>x>>y;
      ll t=x*y;
      for (ll i=1;i<=sqrt(t);i++)
      {
      if (t%i==0&&gcd(i,t/i)==x)
      {
      cnt+=2;
              if (i*i==t)cnt--;
          }
      }
      cout<<cnt<<endl;
      return 0;
      }
      
      • -1
        @ 2025-7-2 20:13:52
        #include<bits/stdc++.h>
        using namespace std;
        long long a,b,c,d,s;
        int i=0;
        long long gcd(long long x,long long y){
        	if(y==0)return x;
        	return gcd(y,x%y);
        }
        long long lcm(long long x,long long y){
        	return x/gcd(x,y)*y;
        }
        int main(){
        	
        	cin>>a>>b;
        	for(int i=a;i<=b;i+=a){
        		if(gcd(i,a*b/i)==a&&lcm(i,a*b/i)==b)s++;
        	}
        	cout<<s;
            return 0;
        }
        
        • 1

        最小公倍数和最大公约数问题(num)

        信息

        ID
        540
        时间
        1000ms
        内存
        256MiB
        难度
        4
        标签
        (无)
        递交数
        189
        已通过
        91
        上传者