题目链接:https://codeforces.com/problemset/problem/222/C
题目大意:
两个数组a,b分别长为n, m。有这么个分数,分子是a数组的乘积,分母是b数组的乘积,现在要你找出两个与a和b等价的数组,使得分数大小不变,而构造出来的分数是最简的。数组长度最大为1e5,元素最大为1e7。
解题思路:
容易想到的是把a,b数组每一个数经行质因数分解,约掉重复的质因数,根据剩下的质因数对原数组的每一个数进行约分。但是,无论是分解质因数还是约分,若是用一般的思路,在此数据范围下,必然超时。所以要在循环条件下手,加一点优化。具体看代码解释。
代码如下:
# include <bits/stdc++.h>
using namespace std;
const int maxn = 1e7 + 5;
bool prime[maxn];
vector <int> p;
int pa[maxn], pb[maxn];
int a[100005], b[100005];
int n, m;
void init(){
for(int i = 2; i < maxn; ++i){
if(!prime[i]){
p.push_back(i); //把质数放入一个vector中,分解数时要用上
for(int j = i+i; j < maxn; j += i)