Codeforces Round #705 (Div. 2)/D. GCD of an Array

1493 D. GCD of an Array(map+multiset应用) LINK 动态维护每一个质因子的最小值,相乘就是答案. 因为每次只乘上一个数,一个数的质因子最多只有log(n)log(n)log(n)个 所以整体质因子只有nlog(n)nlog(n)nlog(n)个,空间复杂度足够 我们可以开一个二维mapmapmap记作mp[i][j]mp[i][j]mp[i][j]表示a[i]a[i]a[i]中有多少质因子jjj 再开一个multisetmultisetmultiset记作cnt[i]cnt[i]cnt[i] cnt[i]cnt[i]cnt[i]里面的数是每个a[i 阅读详情

Codeforces Round #705 (Div. 2)

D. GCD of an Array

题意:给出一个长度为n的数组,每次对其中一个元素进行乘法操作,然后询问整个数组的GCD。

首先肯定想到的是,对数组的元素进行质因数分解,然后每次更新只用更新单个元素的质因数表达式。同时维护所有元素共有质因数的最小次幂,以便求GCD。

之后需要考虑的式用什么数据结构来维护每个元素的质因数表达式和所有元素共有质因数的最小次幂。
1、对于维护每个元素的质因数表达式。如果用vector则不便于修改,方法之一是可以使用map建立质因数和其次幂之间的映射,每次修改和查询所需的时间复杂度为O(logn)O(logn)O(logn)。
2、对于维护所有元素共有质因数的最小次幂,一开始的想法是用一个数组来维护,但是数组只能维护历史最小值,并不能动态维护最小值。解决方法之一是使用multiset,用每个multiset维护一个质因数的所有次幂,当且仅当集合大小为n时,表明这个质因数是所有元素共有质因数,因为multiset自动维护集合中元素的有序性,所以集合第一个元素即为最小次幂,修改即是对集合的插入和删除,复杂度为O(logn)O(logn)O(logn)。
3、每次修改后都重新遍历所有集合求GCD的做法时间复杂度太大,大概是O(qlogn+qn)O(qlogn+qn)O(qlogn+qn),注意到当且仅当集合的大小为n时,该质因数对答案才有贡献,而且修改只会让更多的质因数作出更多的贡献,所以我们可以维护ansansans,每次修改时,对ansansans造成变化只可能是修改的那个元素,所以我们只需要记录修改前质因数的最小次幂和修改后质因数的最小次幂,两者做差xxx,那么该质因数ppp对答案的贡献为pxp^xpx。这样一来询问的时间复杂度大致为O(qlogn)O(qlogn)O(qlogn)。

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int max_n=2e5+5;
const int mod=1e9+7; 
int prime[max_n];
int vis[max_n];
map<int,int> f[max_n];
multiset<int> e[max_n];
multiset<int>::iterator it;
set<int> vi;
int cnt=0;
int tot,q;
ll ans=1;
void init(void)
{
	for(int i=2;i<max_n;i++)
	{
		if(!vis[i])prime[cnt++]=i;
		for(int j=0;j<cnt&&i*prime[j]<max_n;j++)
		{
			vis[i*prime[j]]=1;
			if(i%prime[j]==0)break;
		}
	}
}
ll qpow(ll a,int n,int mod)
{
	ll ans=1;
	while(n)
	{
		if(n&1)ans=ans*a%mod;
		a=a*a%mod;
		n>>=1;
	}
	return ans;
}
void update(int x,int v,map<int,int> &f)
{
	int pre=0;
	if(e[x].size()==tot)pre=*(e[x].begin());
	it=e[x].find(f[x]);
	if(it!=e[x].end())e[x].erase(it);
	f[x]+=v;
	e[x].insert(f[x]);
	if(e[x].size()==tot)ans=ans*qpow((ll)x,*(e[x].begin())-pre,mod)%mod;	
}
void resolve(int n,map<int,int> &f)
{
	for(int i=0;i<cnt&&prime[i]*prime[i]<=n;i++)
	if(n%prime[i]==0){
		int time=0;
		int pre=0;
		while(n%prime[i]==0)n/=prime[i],time++;
		update(prime[i],time,f);
		if(n==1)break;
	}
	if(n!=1){
		update(n,1,f);
	}
}
int main(void)
{
	init();
	scanf("%d%d",&tot,&q);
	int x,index;
	for(int i=1;i<=tot;i++)
	{
		scanf("%d",&x);
		resolve(x,f[i]);
	}
	while(q--)
	{
		scanf("%d%d",&index,&x);
		resolve(x,f[index]);
		printf("%lld\n",ans);
	}
}
//2 2
//2 2
//1 2
//2 2
YOLOv8剪枝实战:基于torch_pruning的模型优化与性能提升指南 本文详细介绍了如何使用torch_pruning工具对YOLOv8模型进行结构化剪枝,以实现模型轻量化与性能提升。通过实战步骤解析,包括环境搭建、依赖图分析、迭代剪枝与微调策略,帮助开发者有效减少模型参数量和计算量,提升在边缘设备上的推理速度,同时保持检测(detect)与分割(segment)任务的精度。 阅读详情

相关推荐

Windows服务器XMRig挖矿病毒深度清除实战指南

XMRig是一种广泛用于Monero(XMR)加密货币挖矿的开源工具,其在Windows环境中的持久化机制已远超传统木马范畴,融合WMI事件订阅、服务伪装、PowerShell无文件执行与注册表隐写等多重反检测技术。理解其基于行为而非特征的生存逻辑,是实现有效检测与根除的前提。该技术具备强隐蔽性、高自愈性与网络通信合法化特征,常见于RDP弱口令爆破、SMB共享泄露及PowerShell远程执行等非漏洞类入侵场景。本文聚焦Windows原生命令与Sysinternals工具链,提供覆盖进程定位、WMI清理、服

weixin_30535843的博客 730

D. GCD of an Array(数论、multiset)

题目 对于n个元素的gcd,将每个元素质因数分解,对于一个质数如果每个元素都有其作为因数,那么这个质数p对答案的贡献为p^(所有元素分成质因数相乘中p的最小次方) a1=p1^b1 …* pi^c1* … pm^d1 a2=p1^b2 … * pi^c2 *… pm^d2 … an=pn ^ bn…*pi ^ cn … pm^dn 如质数pi,其对答案贡献为 pi^(min(c1,c2,c3…,cn)),将质因数的贡献相乘即为最终答案。 如果某个质因数不是n个元素都有,那么其没有产生贡献。所以我们需要

Rikkaの博客 304

WSL2下用QEMU模拟ARM开发板:从编译uboot到调试全流程(附常见错误解决)

本文详细介绍了在WSL2环境下使用QEMU模拟ARM开发板的完整流程,包括uboot编译、内核调试等关键步骤。通过QEMU模拟vexpress-a9开发板,开发者可以高效搭建嵌入式开发环境,解决常见错误并提升开发效率。

solidity8miner的博客 285

Codeforces Round #705 (Div. 2) CD

Codeforces Round #705 (Div. 2) A. Anti-knapsack 题意: 1到n的数中取一个size最大的集合要求没有任意若干个数的和为k,求这个size #include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { int T, n; cin >> T; while(T--) { int n, k; cin >> n &g

juraws的博客 527

【论文阅读】LIME:Low-light Image Enhancement via Illumination Map Estimation(笔记最全篇)

文章目录AbstractIntroductionContributionMethodSpeed-up Method(1):ALM子问题 T子问题 G子问题 Z和μ\muμSpeed-up Method(2):权重变量实验conclusion 今天要整理的一篇论文是使用传统的方法解决低照度的问题,Guo等人于2016年发表在IEEE上,论文《LIME:Low-light Image Enhance...

florrie 2万+

第21章—技术管理篇(上):身为技术人该怎样带好团队并做好管理者

上节讲了职业规划和学习提升这两个话题,随着职业规划的不断落地,或者自己能力的不断提升,大家也会逐渐被提拔成“职级更高”的人。企业规模扩张时,员工数量也会变多,意味着Boss需要更多的人来辅助管理,而管理者会从外部招聘吗?也许会,但大多企业更喜欢从内部选拔,毕竟人的天性更希望找的人值得信赖。此时,一些能力不错、做事靠谱的老员工,就会被“赶上”管理者的位子。作管理不难,但想要“”就需要一定情商。

运维老生常谈 1364

Codeforces Round #705 (Div. 2)

...

curry的博客 251

RAP 通用搜索实战:用 CDS 注解打造 Fiori Elements 的一体化检索体验

RAP应用中的通用搜索优化实践:通过CDS注解实现高效模糊匹配 摘要:本文介绍了在SAP RAP应用中优化列表搜索体验的方法。通过CDS注解配置通用搜索功能,用户无需指定字段即可在多字段中模糊匹配数据。关键实现包括:1)使用@Search.searchable启用全局搜索;2)通过@Search.defaultSearchElement标记核心搜索字段;3)利用@Search.fuzzinessThreshold设置容错阈值(0.7-1.0)处理拼写错误;4)使用@Search.ranking优化结果排序。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1397

Codeforces Round #705 (Div. 2)-D. GCD of an Array

D. GCD of an Array STL 题意 见原题 思路 见注释 代码 ll n,q,a,ans=1; vector<int> fac[maxn]; map<int,int> mp[maxn]; map<pair<int,int>,int> M; void init()//分解质因子 { for(int i=2;i<=2e5;i++) { int now=i; for(int j=2;j*j<=i;j++)

自伤无色的博客 350

破解现代反爬虫:JS加密、OB混淆与CSS反爬的实战攻防分析

摘要: 随着反爬技术的升级,JS加密、OB混淆和CSS反爬成为主流防护手段,阻碍传统爬虫获取数据。本文解析了这些技术的工作原理,并提出破解策略:通过模拟浏览器(如Selenium、Puppeteer)执行动态JS,逆向混淆代码,以及利用开发者工具突破CSS隐藏。针对复杂防护,开发者需结合技术分析与工具应用,如API接口抓取、动态渲染破解等,以应对不断演进的反爬机制。未来,爬虫攻防将持续升级,需保持技术敏锐性。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1643

YOLOv10改进,YOLOv10添加DICAM,用于水下图像增强模块,以提高朦胧水下图像的质量、对比度和色偏

在水下环境中,成像设备会出现水浑浊、光衰减、散射和颗粒问题,导致图像质量低、对比度差和彩色图像有偏差。这给使用传统视觉技术进行水下状态监测和检查带来了巨大挑战。近年来,水下图像增强因其在提高当前计算机视觉任务在水下目标检测和分割中的性能方面发挥着关键作用而受到越来越多的关注。由于主要从自然场景构建的现有方法在提高色彩丰富度和分布方面存在性能限制,作者提出了一种新颖的基于深度学习的方法,即 Deep Inception 和 Channel-wise Attention Modules (DICAM),以提高朦

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 479

codeforces round #705 div2 D. GCD of an Array multiset与质因数分解

codeforces round #705 div2 D. GCD of an Array multiset与质因数分解题意思路Code 传送门:https://codeforces.com/contest/1493/problem/D 题意 给一个长度为n的序列,有q个操作,每次操作会将第i个数乘x,在输出gcd(所有数).给一个长度为n的序列,有q个操作,每次操作会将第i个数乘x,在输出gcd(所有数).给一个长度为n的序列,有q个操作,每次操作会将第i个数乘x,在输出gcd(所有数). 思路 因为每次

狙击美佐的博客 176

100天精通Python(基础篇)——第4天:数据类型全解析_从基础到转换

数据类型全解析_从基础到转换

努力让自己发光,对的人才能迎着光而来 11万+

Codeforces Round #705 (Div. 2) 1493题解AB/C. K-beautiful Strings/D. GCD of an Array/E. Enormous XOR

Codeforces Round #705 (Div. 2) 1493题解 A. Anti-knapsack A题传送门 题意: 给我们一个n,一个k(n,k<=1000),需要我们得到一个集合,集合的元素全部小于n,并且任意子集相加不等于k,而且这个集合元素相加尽可能大。 题解: 贪心。 1.若k<n,则{x|k<x<=n,x∈Z} 都满足 2.考虑小于k的那些元素中,我们希望取到最多的元素,那么只能取一半,并且是最大的那一半,例如k=7时,那么可以取4,5,6;如果k=8,那

Aajbelieve的博客 772

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

题目链接 You are given an array aaa of length nnn. You are asked to process qqq queries of the following format: given integers iii and xxx, multiply aia_iai​ by xxx. After processing each query you need to output the greatest common divisor (GCD) of all eleme

sky123博客 331

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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,当前

Aajbelieve的博客 430

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Codeforces Round #705 (Div. 2) D. GCD of an Array 质因子分解 + stl维护

传送门 题意: 给nnn个数,让后qqq个操作,每次选择一个位置的数使其乘xxx,每次询问后输出所有数的gcdgcdgcd。 思路: 这个题思路算是比较好想的。首先就是一个计算方式即计算所有数的gcdgcdgcd,这个比较容易想到当一个质因数xxx在每个数出现次数>=1>=1>=1的时候,设出现幂数是c1,c2,...,cnc_1,c_2,...,c_nc1​,c2​,...,cn​,他对gcdgcdgcd的贡献为xmin(c1,c2,...,cn)x^{min(c_1,c_2,...,c

m0_51068403的博客 604

Codeforces Round #705 (Div. 2)-D. GCD of an Array,数论+数据结构(好题)

题目大意: 给你一个长度为nnn的序列。qqq次操作。每次操作ai:=ai∗xa_i:=a_i*xai​:=ai​∗x。每次操作完问你gcd(a1,...,an)gcd(a_1,...,a_n)gcd(a1​,...,an​). n≤2e5n \leq 2e5n≤2e5 题目思路: 这题的关键点有: 1.gcd可以按素数独立计算贡献 2.所有数所产生的素数个数不会很多,在logn级别。 1.离线做法 + 线段树:(空间最小) 分析:没有要求强制在线,所以我们可以考虑离线做。我们将初始化也看作是nnn次操作。

qq_35577488的博客 418

Codeforces Round #705 (Div. 2) D. GCD of an Array (素因子分解+数据结构)

题目链接:https://codeforces.com/contest/1493/problem/D 题目大意:输入两个数, 接下来输入个数, 接下来次询问。 每次询问输入,我们需要把乘以,,求出,答案模以。 题解:由于数字可能很大,我们需要将数字进行素因子分解,可以用存数字素因子分解的形式。 对于素因子分解,我们可以采用埃拉托色尼筛选法 对于每个素数,我们可以用或维护素数的幂出现的次数。 由于每次都是乘操作,答案只增不降,对于每次询问,我们可以维护当前的答案,每次只更新变化的素因子的.

madaidao的专栏 210

Codeforces Round #705 (Div. 2) D. GCD of an Array 动态开点线段树+质因数分解

原题链接:https://codeforces.ml/contest/1493/problem/D 目录题意分析Code 题意 有n个数,每回合可以对某个位置的数乘x,并求出所有数的gcd 分析 区间gcd问题,数值很大,不能暴力求解,因此可以维护最小个数的质因子个数 例如有三个数 a=p1ka1p2ka2p3ka3...a=p_1^{k_{a_1}}p_2^{k_{a_2}}p_3^{k{a_3}}...a=p1ka1​​​p2ka2​​​p3ka3​​... b=p1kb1p2kb2p3kb3...b=

kaka03200的博客 236

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

题意: 给出一个长度为 nnn 数组,和 qqq 次操作,每次操作将 第 iii 位的数乘上 xxx ,然后输出全部数的 gcdgcdgcd 。 题解: 可以将 gcdgcdgcd 考虑成每个质数的贡献,即所有数分解后质数的最低次幂。 先预处理出n个数分解后质数有多少次幂,用 mapmapmap 存一下,mp[i][j]mp[i][j]mp[i][j] 表示第 iii 个数分解后质数 jjj 有多少次幂。 然后再用 multisetmultisetmultiset 存每个质数分别在 111 到 nnn 里

the best 的博客 253

Codeforces D. GCD of an Array (map&set&维护多个数的gcd) (Round #705 Div.2)

传送门 题意:给你n个数和q次询问,每次询问给出i,x,让你在上乘以x并求出现在所有数的gcd。 思路: 都知道多数的gcd必定需要质因数分解,但是该题询问q次,如若每次都更改再循环的话必定超时。 这个题和2021牛客寒假算法基础集训营4的J题基础有些相似,也想过利用二维数组维护每个数的每个质因子的出现次数(用动态map)和最小次方数(用动态set方便取最小数和增删操作)。 但是考虑到时间空间的复杂度一直没有实现代码,赛后参考大佬博客才将代码实现,具体思路如下图和代码注释: 代码实现:

Satur9的博客 293

codeforces round 705 CD

C、K-beautiful Strings 计算为使满足条件所需的字母个数sum;然后从倒序遍历,计算将该字母升序之后,更新sum值,看是否为0,是则可以;若不成则往前继续算,但此时最后一个位置放空不看,因为前一个升序,不管后一个是什么字母,一定满足升序;所以此时sum值可以为1;以此类推直到sum值满足条件,然后正常构造即可 /* * @Author: your name * @Date: 2021-03-06 22:45:10 * @LastEditTime: 2021-03-08 17:39:3

weixin_45720246的博客 192

Codeforces Round #705 (Div. 2)D. GCD of an Array(线段树动态开点or set+map)

Codeforces Round #705 (Div. 2)D. GCD of an Array(线段树动态开点or set+map) 题意: 有n个数,每回合可以对某个位置的数乘x,并求出所有数的gcd 思路: 把a1质因数分解,pi表示各质因子,xi表示幂 a1=p1x11∗p2x12∗p3x13a1={p_1}^{x_{11}}*{p_2}^{x_{12}}*{p_3}^{x_{13}}a1=p1​x11​∗p2​x12​∗p3​x13​… a2=p1x21∗p2x22∗p3x23a2={p_1}^{

weixin_45722843的博客 202
上一篇: 牛客IOI周赛23-普及组 /D(序列dp)
下一篇: Codeforces Round #707 Div. 2/C Going Home
WedsonLin
博客等级 码龄7年 1粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值