4 条题解

  • 1
    @ 2023-4-2 14:32:53
    # include <bits/stdc++.h>
    using namespace std;
    long long gcd(long long a, long long b) {
    	if (b == 0) {
    		return a;
    	} else {
    		return gcd(max(a % b, b), min(a % b, b));
    	}
    }
    int main() {
    	int P, Q;
    	cin >> P >> Q;
    	int ret = 0;
    	for (int i = P; i <= Q; i++) {
    		if ((P * Q) % i == 0 && gcd(i, (P * Q) / i) == P) {
    			ret++;
    		}
    	}
    	printf("%d", ret);
    	return 0;
    }
    
    • 1
      @ 2022-7-12 23:08:31
      #include<iostream>
      #include<cmath>
      using namespace std;
      typedef long long ll;
      int m,n,ans,flag;
      ll gcd(ll x,ll y)
      {
          if(y==0)    {return x;}
          return gcd(y,x%y);
      }
      int main()
      {
          cin>>n>>m;
          for(int i=1;i<=sqrt(1ll*m*n);i++)
          {
              if((1ll*n*m)%i==0&&gcd(i,(1ll*n*m)/i)==n)
              {
                  ans++;
                  if(1ll*i*i==1ll*n*m)  flag=1;
              }
          }
          cout<<ans*2-flag;//最后乘以二是因为只遍历了一半
          return 0;
      }
      
      • 0
        @ 2024-1-30 14:18:08

        由于gcd(a,b)lcm(a,b)=ab\gcd(a,b)\cdot\operatorname{lcm}(a,b)=ab ,我们有PQ=x0y0PQ=x_0y_0,所以在此基础上,找出所有乘积为x0y0x_0y_0且最大公约数为x0x_0(P,Q)(P,Q)即可。

        P=t1x0,Q=t2x0P=t_1x_0,Q=t_2x_0,由于gcd(P,Q)=x0\gcd(P,Q)=x_0,所以显然t1,t2t_1,t_2互质,这启发我们枚举所有互质的(t1,t2)(t_1,t_2)即可。因为PQ=x0y0PQ=x_0y_0,所以t1t2=y0x0(x0<y0)t_1t_2=\dfrac{y_0}{x_0}(x_0<y_0),枚举y0x0\dfrac{y_0}{x_0}的所有约数即可。时间复杂度为O(nlogn)O(\sqrt{n}\log{n})。相应地,这也告诉我们当y0y_0无法被x0x_0整除时,题目无解。

        最后注意一点, x0=y0x_0=y_0时要特判,输出11

        #include <iostream>
        #include <cmath>
        
        using namespace std;
        
        int x, y, t;
        long long ans;
        
        int gcd(int a, int b) {
        	if (b == 0) return a;
        	return gcd(b, a % b);
        }
        
        int main() {
        	ios::sync_with_stdio(false);
        	cin.tie(nullptr), cout.tie(nullptr);
        
        	cin >> x >> y;
        	if (x > y) swap(x, y);
        	if (y % x != 0) {
        		cout << 0 << endl;
        		return 0;
        	}
        	t = y / x;
        	if (t == 1) {
        		cout << 1 << endl;
        		return 0;
        	}
        	for (int i = 1; i * i < t; ++i)
        		if (t % i == 0 && gcd(t / i, i) == 1)
        			++ans;
        	ans *= 2;
        	cout << ans << endl;
        
        	return 0;
        }
        
        • 0
          @ 2023-12-17 15:08:37

          include <bits/stdc++.h>

          using namespace std; long long gcd(long long a, long long b) { if (b == 0) { return a; } else { return gcd(max(a % b, b), min(a % b, b)); } } int main() { int P, Q; cin >> P >> Q; int ret = 0; for (int i = P; i <= Q; i++) { if ((P * Q) % i == 0 && gcd(i, (P * Q) / i) == P) { ret++; } } printf("%d", ret); return 0; }

          • 1

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

          信息

          ID
          30
          时间
          1000ms
          内存
          125MiB
          难度
          2
          标签
          递交数
          49
          已通过
          21
          上传者