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