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 1≤A,B≤1012
输出描述
输出一行一个正整数,代表最多选择的互质的公共因数的个数
样例一
输入
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集训队每周程序设计竞赛(13)题解
2021-2022-2 ACM集训队每周程序设计竞赛(13)题解
2021-2022-2 ACM集训队每周程序设计竞赛(13)题解