[GDUT 决赛]--GCD,LCM——我是好人(数论)

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\n", 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

解题思路:(1)a,b 两数的最大公约数是n,最小公倍数是m,m 其实就是 n 乘以 a,b 各自特有的因子.那么

     肯定就有 m % n ==0 . 换句话说 如果 m % n !=0 那么 输出 就是0; 

     (2)如果n==m直接输出1,两个数相等且等于m;

     (3)设GCD = x,a = k1*x, b = k2*x,因为要使得GCD为x,那么k1,k2要互质,否则的话(假设公因子为c)求得的GCD=x*c,

     那么LCM = k1*k2*x,所以m/n=k1*k2,只要找k1,k2满足该式子就行,所以从1开始到根号m/n,找k1*k2=m/n,

     且两个互质 即GCD(k1,k2)==1 即可,那么复杂度Tn=O(√(m/n)),注意数据开long long!

代码如下:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cmath>
 5 using namespace std;
 6 typedef long long LL;
 7
 8 LL gcd(LL a, LL b){
 9     return !b ? a : gcd(b, a%b);
10 }
11 LL Search(LL n)
12 {
13     LL i, tmp, cnt = 0;
14     for (i = 1; i <= (double)sqrt(n*1.0); i++){
15         if (!(n%i)){
16             //能整除才拆开计算,避免不必要的错误运算
17             tmp = n / i;
18             if (gcd(i, tmp) == 1) cnt++;
19         }
20     }
21     return cnt;
22 }
23 int main()
24 {
25     LL n, m, tmp;
26     int t;
27     scanf("%d", &t);
28     while (t--){
29         scanf("%lld%lld", &n, &m);
30         if (m%n){
31             printf("0\n");
32             continue;
33         }
34         if (n == m){
35             printf("1\n");
36             continue;
37         }
38         tmp = m / n;
39         printf("%lld\n", Search(tmp));
40     }
41     return 0;
42 }

时间: 2024-10-09 03:27:41

[GDUT 决赛]--GCD,LCM——我是好人(数论)的相关文章

GDUT决赛 我是好人

Problem F: 我是好人 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

Uva 11388 GCD LCM ( 数论 )

Uva  11388 GCD LCM( 数论 ) 题意: 求是否存在a,b 使得lcm(a,b) = L, gcd(a,b) = G,不存在输出-1,存在输出a,b,且a尽可能小 分析: 强行暴力是不可能的数据很大,要用llu,这里有两种思路 思路一: 由题意可知 a*b = G*L 保证a = G的倍数的情况下,枚举a再判断G*L能否整除a,最后判断b是否为a的倍数.a从G开始扫到sqrt(G*L) //输入两个整数G,L //找出a,b 使得 gcd(a,b) = G lcm(a,b) =

数论入门2——gcd,lcm,exGCD,欧拉定理,乘法逆元,(ex)CRT,(ex)BSGS,(ex)Lucas,原根,Miller-Rabin,Pollard-Rho

数论入门2 另一种类型的数论... GCD,LCM 定义\(gcd(a,b)\)为a和b的最大公约数,\(lcm(a,b)\)为a和b的最小公倍数,则有: 将a和b分解质因数为\(a=p1^{a1}p2^{a2}p3^{a3}...pn^{an},b=p1^{b1}p2^{b2}p3^{b3}...pn^{bn}\),那么\(gcd(a,b)=\prod_{i=1}^{n}pi^{min(ai,bi)},lcm(a,b)=\prod_{i=1}^{n}pi^{max(ai,bi)}\)(0和任何

数论——gcd&amp;&amp;lcm

gcd(a, b),就是求a和b的最大公约数 lcm(a, b),就是求a和b的最小公倍数 然后有个公式 a*b = gcd * lcm     ( gcd就是gcd(a, b), ( ????? ) 简写你懂吗) 解释(不想看就跳过){ 首先,求一个gcd,然后... a / gcd 和 b / gcd 这两个数互质了,也就是 gcd(   a / gcd ,b / gcd  )  =  1,然后... lcm = gcd *  (a / gcd) * (b / gcd) lcm = (a *

我是好人

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;

广州工业大学2016校赛 F 我是好人4 dfs+容斥

Problem F: 我是好人4 Description 众所周知,我是好人!所以不会出太难的题,题意很简单 给你n个数,问你1000000000(含1e9)以内有多少个正整数不是这n个数任意一个的倍数 最后友情提供解题代码(我真是太好人了) void solve(int p[], int n) { int ans = 0; for (int i = 1; i <= 1e9; i++) { int fl = 0; for (int j = 0; j < n; j++) { if (i % p[

POJ 2429 GCD &amp; LCM Inverse

设答案为ans1,ans2 ans1=a1*gcd,ans2=a2*gcd,a1,a2互质 gcd*a1*b1=lcm,gcd*a2*b2=lcm a1*b1=lcm=(ans1*ans2)/gcd=a1*a2 综上所诉,a1=b2,a2=b1. 也就是说,ans1=gcd*k1,ans2=gcd*k2 要求k1,k2尽量接近,并且k1,k2互质,并且,k2*k2=lcm/gcd 需要用到Pollard_rho分解质因数,然后暴力搜索寻找k1,k2.用了kuangbin大神的Pollard_rh

UVA - 11388 GCD LCM

II U C   ONLINE   C ON TEST   2 008 Problem D: GCD LCM Input: standard input Output: standard output The GCD of two positive integers is the largest integer that divides both the integers without any remainder. The LCM of two positive integers is the

uva 11317 - GCD+LCM(欧拉函数+log)

题目链接:uva 11317 - GCD+LCM 题目大意:给定n,求出1~n里面两两的最大公约的积GCD和最小公倍数的积LCM,在10100进制下的位数. 解题思路:在n的情况下,对于最大公约数为i的情况又phi[n/i]次.求LCM就用两两乘积除以GCD即可. #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; ty