Codeforces Round #705 (Div. 2) 1493D. GCD of an Array题解

D. GCD of an Array

D题传送门
在这里插入图片描述
在这里插入图片描述

题意:

给我们n(小于等于2e5)个数的数组a,然后接着又q(小于等于2e5)次操作,每次操作是将a[i]乘上x(小于等于2e5),要我们求出a[1]到a[n]的最大公因数(gcd)。

题解:

数据结构+数论+算贡献
首先,对于每次操作的结果,必然会使得新的gcd大于等于原先的gcd,这里请思考一分钟。因为对于一个gcd而言,是所有a[i]都存在的因子相乘得到的,那么可能有些a[i]的因子比其他a[i]的因子数目多,比如现在数组a为:6,8,12,当前的gcd=2,很容易知道,8和12其实有两个质因子2,是比6多一个2的,如果将6乘上一个2,那么gcd也就可以乘上2,因为现在三个数都多出来一个2。我们就根据这个思路来完成这道题。
为了降低复杂度,我们首先将每个小于等于2e5的最小质因子打表算出来。然后我们先假设数组a的每个数都是1,那么最初的gcd就是1,然后对于每个给我们的a[i],我们将他分解一下,因为前面我们已经打表处理了每个数的最小质因子,那么就可以求出a[i]的最小质因子的个数,那么我们就求出了现在额外多出来的某种质因子有多少个,如果恰好这个a[i]之前的拥有的该质因子的个数是a数组中所有数的最少的,那么现在额外增加若干个该质因子,那么gcd就会增大了,这里体现的就是上面的例子的思想。我们现在有解决的问题就是如何在较低的复杂度中得到所有a[i]中最少拥有某个质因子的个数是多少,这里我们使用multiset,将每个a[i]的某种质因子放入对应的multiset中,比如2就放入2的multiset中,这里我们开2e5个mutiset。具体实现看代码,代码中有也有详细解释。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 200005;
const ll mod = 1e9+7;
int n,q,a[MAXN],min_prime_of[MAXN],ans=1;
multiset<int>cnt_OfSomeprime_OfEvery
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值