我是好人

Description

众所周知,我是好人!

所以不会出太难的题,题意很简单 给你两个数n和m,问你有多少对正整数对最大公约数是n,最小公倍数是m

最后友情提供解题代码(我真是太好人了)

void solve()

{

   long long n, m;

   scanf("%lld%lld", &n, &m);

   int ans = 0;

   for (long long i = 1; i <= m; i++)

   {

      for (long long j = i; j <= m; j++)

      {

           if (gcd(i, j) == n && lcm(i, j) == m) ans++;

      }

   }

   printf("%d ", ans);

}

祝大家AC愉快!最好AK,送某扬兑现诺言^_^

Input

输入第1行是一个整数T,表示共T组数据。 接下来是T组数据,每组数据占1行,每一行有2个整数n,m(1 <= n, m <= 10000000000),两个数由一个空格隔开。

Output

结果输出T行,对应T组数据。(T<=100) 
每行输出这样的正整数对有多少对(看我多好人,不用你们输出所有整数对)

Sample Input

3 1 1 7 10086 4 16

Sample Output

1 0 1

HINT

分析:设 a = x*m

     b = y*m

            则 n = x*y*m

所以x*y = n/m,且x,y互质。

所以枚举x,y就可以了 复杂度为O(sqrt(m/n))

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <string>
 5 #include <algorithm>
 6 #include <cmath>
 7 using namespace std;
 8 long long  fun(long long a, long long b){
 9     if(b == 0) return a;
10     else return fun(b, a%b);    
11 }
12 int T; 
13 long long m ,n;
14 int main(){
15     scanf("%d", &T);
16     while(T--){
17         cin>>n>>m;
18         if(m%n!=0){
19             printf("0
");continue;
20         }
21         n = m/n;
22         int t = 1;
23         for(int i = 2; i <= sqrt(double(n)); i++){
24             if(n%i == 0){
25                 if(fun(i,n/i) == 1) t++;
26             }
27         }
28         cout<<t<<endl;
29     }
30       
31     return 0;
32 }
33  
原文地址:https://www.cnblogs.com/titicia/p/4347402.html