2021-2022-2 ACM集训队每周程序设计竞赛 - 问题 D: 上数论课 - 题解

Posted Tisfy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-2022-2 ACM集训队每周程序设计竞赛 - 问题 D: 上数论课 - 题解相关的知识,希望对你有一定的参考价值。

传送门


上数论课

时间限制:1秒
空间限制:128M


题目描述

同学们都进入了教室后,李老师上起了数论课。

给你两个正整数 A A A B B B,从中选择一些 A A A B B B 的公共因数,并且要保证选取的这些因数是互质的。

请问最多选择多少个公共因数。

因数解释 如果 a % b = 0 ,那么 b 就是 a 的因数。

输入描述

A B

第一行空格隔开的两个正整数 A A A B B B

数据范围:

  • 1 ≤ A , B ≤ 1 0 12 1\\leq A, B\\leq 10^12 1A,B1012

输出描述

输出一行一个正整数,代表最多选择的互质的公共因数的个数


样例一

输入

12 18

输出

3

12 和 18 的公共因子有1,2,3,6

最多可以从中选择三个(如1,2,3)使得所选因子互质

样例二

输入

420 660

输出

4

样例三

输入

1 2019

输出

1

题目分析

我们只需要把 A A A B B B 分别分解质因数,然后输出 A A A B B B的共同质因数的个数即可。

具体方法:

对于 A A A,我们只需要把 A A A 2 2 2 s q r t ( A ) sqrt(A) sqrt(A)进行取模。在 i i i A A A的因数的时候,就不断让 A A A除以 i i i,同时 c n t [ i ] + + cnt[i]++ cnt[i]++

这样例如 4 4 4 12 12 12的因数,当 i = 2 i=2 i=2时, 12 12 12会一直除以 2 2 2,直到不再是 2 2 2的倍数。这样就模 4 4 4时余数就不等于 0 0 0,也就是说非质数的 4 4 4不会被统计。


AC代码

#include <bits/stdc++.h>
using namespace std;
#define mem(a) memset(a, 0, sizeof(a))
#define dbg(x) cout << #x << " = " << x << endl
#define fi(i, l, r) for (int i = l; i < r; i++)
#define cd(a) scanf("%d", &a)
typedef long long ll;

const int SIZE_ = 1e6 + 1;
int primeA[SIZE_];
int primeB[SIZE_];

int main() 
    ll a, b;
    cin >> a >> b;
    ll to = max(sqrt(a), sqrt(b));
    for (ll i = 2; i <= to; i++) 
        while (a % i == 0)   // a 是 i 的整数倍
            primeA[i]++;
            a /= i;
        
        while (b % i == 0) 
            primeB[i]++;
            b /= i;
        
    
    int ans = 1;  // 所选因数中除了质数外还可以多选择一个“1”
    for (int i = 2; i <= to; i++) 
        ans += primeA[i] && primeB[i];  // i同时是a和b的因数
    
    if (a == b && a != 1)  // 如果剩下的a是一个大于sqrt(a)的质数
        ans++;
    cout << ans << endl;
    return 0;

原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/123415455

以上是关于2021-2022-2 ACM集训队每周程序设计竞赛 - 问题 D: 上数论课 - 题解的主要内容,如果未能解决你的问题,请参考以下文章

2021-2022-2 ACM集训队每周程序设计竞赛题解

2021-2022-2 ACM集训队每周程序设计竞赛(13)题解

2021-2022-2 ACM集训队每周程序设计竞赛(13)题解

2021-2022-2 ACM集训队每周程序设计竞赛(13)题解

2021-2022-2 ACM集训队每周程序设计竞赛 - 问题 C:回到学校 - 题解

2021-2022-2 ACM集训队每周程序设计竞赛(10) - 问题 C: 下一个素数 - 题解