CF222C Reducing Fractions

题目大意:

给出两个集合,第一个集合数的乘积是分子,第二个集合的数的乘积是分母,要求够造一个同样的集合,但是得到的分数是最简分数。

分析:

寻找思路并不复杂,对两个集合的每个数进行质因数分解,然后统计整个集合的质因数分解情况,再将两个集合的质因数的次数大减小即可。构造时使两个集合中元素的个数不变,尽可能地构造成原先集合的数,如果不行就填一个 1。但质因数分解的过程中不能采用 O(n) 的复杂度,会超时,接下来介绍本题中进行质因数分解的方法。
其实也不是很复杂,就是对于每个被分解的数,优先除以它最大的质因数即可。当然,需要提前处理一下每个数最大的质因数。

AC代码:

#include<bits/stdc++.h> #define int long long using namespace std; const int M = 1e7; const int MAXN = 1e4; int n,m; map<int,int> cnt1,cnt2; set<int> s; int prime[M + 5],up[M + 5],down[M + 5],a[M + 5],bb[M + 5]; signed main(){ //freopen("B.out","r",stdin); //prime.push_back(9999991); for(int i = 2; i <= M; i++){//预处理每个数的最大质因数 if(prime[i] == 0){ prime[i] = i; for(int j = i + i; j <= M + 3; j+=i){ prime[j] = i; } } } cin >> n >> m; for(int i = 1; i <= n; i++){ cin >> a[i]; int j; for(j = a[i]; j > 1; j /= prime[j]){//质因数分解 s.insert(prime[j]); up[prime[j]]++;//存储分子的质因数分解情况 } } for(int i = 1; i <= m; i++){ cin >> bb[i]; int j; for(j = bb[i]; j > 1; j /= prime[j]){//质因数分解 s.insert(prime[j]); down[prime[j]]++;//存储分母的质因数分解情况 } } int b; int now = 1; cout << n << " " << m << "\n"; for(int i = 1; i <= n; i++){ int j; int tmp =1; for(j = a[i]; j > 1; j /= prime[j]){ if(down[prime[j]] > 0){ down[prime[j]]--;//如果当前该数的质因数能在分母里也含油1,那么就将它约去,否则将它乘到答案里面 } else{ tmp *= prime[j]; } } cout << tmp << " "; } puts(""); for(int i = 1; i <= m; i++){ int j; int tmp = 1; for(j = bb[i]; j > 1; j /= prime[j]){ if(up[prime[j]] > 0){ up[prime[j]]--;//同上 } else{ tmp *= prime[j]; } } cout << tmp << " "; } return 0; }

__EOF__

本文作者Never Gonna Give You Up!
本文链接https://www.cnblogs.com/CZ-9/p/16502147.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   腾云今天首飞了吗  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示