传送门

题意: 给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_n)}xmin(c1​,c2​,...,cn​)。让后对于乘操作,可以发现gcdgcdgcd是单调不减的,所以我们可以递推下去。让后比较显然的就是维护每个质因子在数组nnn中出现的次数,每次取minminmin,让后就会想到对于每个质因子建一颗线段树,但是显然是不行的,空间直接炸掉了。所以需要考虑用其他东西维护,题解是用multisetmultisetmultiset维护的,stlstlstl真香 。
让后就是实现的细节了,当multisetmultisetmultiset的大小为nnn的时候才能更新,更新的时候取最小值,由于multisetmultisetmultiset是自己排序的,所以直接取头部的元素即可。让后更新的时候需要看看是否之前已经更新了一部分mimimi,如果更新过了要从mi+1mi+1mi+1到cntcntcnt更新。
还是对multisetmultisetmultiset不熟悉,比赛想到了用但是不会用 。
最后优化的一点就是lognlognlogn分解质因子。

//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n,q;
int a[N],nt[N];
multiset<int>s[N];//s[i]表示质因子i在数组中的分布
map<int,int>mp[N];//mp[i][j]表示第i个数的质因子j的个数
bool st[N];
LL ans=1;void add(int id,int x)
{while(x!=1){int div=nt[x],cnt=0;while(div==nt[x]) cnt++,x/=nt[x];int mi;if(s[div].size()==n) mi=*s[div].begin();else mi=0;if(mp[id][div]==0){s[div].insert(cnt),mp[id][div]+=cnt;if(s[div].size()==n){int cnt=*(s[div].begin());for(int i=mi+1;i<=cnt;i++) ans=ans*div%mod;}}else{int t=mp[id][div]; mp[id][div]+=cnt;s[div].erase(s[div].find(t));s[div].insert(mp[id][div]);if(s[div].size()==n){int cnt=*(s[div].begin());for(int i=mi+1;i<=cnt;i++) ans=ans*div%mod;}}}
}int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);for(int i=2;i<N;i++){if(st[i]) continue;nt[i]=i;for(int j=i+i;j<N;j+=i)st[j]=true,nt[j]=i;}scanf("%d%d",&n,&q);for(int i=1;i<=n;i++){int x; scanf("%d",&x);add(i,x);}while(q--){int x,id; scanf("%d%d",&id,&x);add(id,x);printf("%lld\n",ans);}return 0;
}
/**/

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

  1. Codeforces Round #632 (Div. 2) C. Eugene and an array 思维 + 前缀和

    传送门 文章目录 题意: 思路: 题意: 给定一个长度为nnn的序列aaa,定义一段区间为好区间是这段区间的所有连续子区间的和都不为000,求好区间的个数. 思路: 套路题,定义aia_iai​的前缀 ...

  2. Codeforces Round #705 (Div. 2) A-D

    明显感觉到码力下降了 需要老年人康复训练计划 这场码力比较大 需要思维比较巧来减少码力 算是少见的cf div2了 A. Anti-knapsack 给你 nnn 和 kkk ,问是否有办法找出最大的 ...

  3. Codeforces Round #323 (Div. 2) C. GCD Table

    C. GCD Table 题目链接: http://codeforces.com/contest/583/problem/C 题意是给你n个数,可以构成n*n的GCD矩阵,矩阵里的元素顺序可以是任意的 ...

  4. Codeforces Round #323 (Div. 2) C.GCD Table

    C. GCD Table The GCD table G of size n × n for an array of positive integers a of length n is define ...

  5. Codeforces Round #323 (Div. 2): C. GCD Table(思维题)

    题意: 给你一个长度为n的序列a[1]~a[n], 之后用这个序列生成一个n*n的矩阵,其中矩阵第i行第i列的值为a[i],第i行第j列(j!=i)的值为Gcd(a[i], a[j]),现在给你一个矩 ...

  6. Codeforces Round #700 (Div. 2) D1 D2. Painting the Array 思维

    link 题意: 给一个数组,让你从头开始选出一些数放在AAA数组中,剩下的放在BBB数组中,且是有序选择,让后把两个数组中相邻且相等的元素合并. D1: 使合并后Len(A)+Len(B)Len(A ...

  7. Codeforces Round #672 (Div. 2) C2 - Pokémon Army (hard version)(贪心,维护变化值)

    x数组里选一个子数组y(原数组顺序),y1-y2+y3-y4+- 的最大值 然后还有q次交换操作,每次修改之后都要输出新的最大值 (1)如果没有修改,单纯对于当前数组考虑,我们最后选出来的点肯定是波峰 ...

  8. Codeforces Round #601 (Div. 2) E2. Send Boxes to Alice (Hard Version) 思维 + 质因子

    传送门 文章目录 题意: 思路: 题意: 大体题意跟easyeasyeasy版本差不多,就是hardhardhard版本的aaa范围更大.见这里Codeforces Round #601 (Div. ...

  9. Codeforces Round #736 (Div. 2) D. Integers Have Friends ST表gcd + 尺取

    传送门 文章目录 题意: 思路: 题意: 给你一个序列aaa,求一个最长的子序列[l,r][l,r][l,r]满足aimodm=ai+1modm=...=armodma_i\bmod m=a_{i+1 ...

最新文章

  1. HSQL入门及使用指南
  2. java中的内部接口
  3. Semantic UI实现一个landing page
  4. [原]第一次遭遇Oracle的Bug,纪念一下 |ORA-00600 kmgs_pre_process_request_6|
  5. Weblogic EJB 学习笔记(2)精
  6. python开源项目贡献_65%的公司在为开源项目做贡献
  7. python数据预测模型算法_《python机器学习—预测分析核心算法》:构建预测模型的一般流程...
  8. mysql webmail ubuntu12.04 imap_Ubuntu 12.04下搭建Web网站服务器 (MySQL+PHP+Apache环境)教程...
  9. FuisonInsight Hadoop中新增用户和Hbase授权
  10. Ribbon客户端负载均衡算法分析
  11. No module named ‘wrapt‘
  12. 高级语言程序设计(c语言版)课后答案,高级语言程序设计习题与解答(C语言版)/高等院校教材...
  13. 51单片机流水灯画图打板焊元件历程
  14. 如何解决克隆虚拟出现的Device eth0 does not seem to be present,delaying initialization错误
  15. Oracle数据库岗位,Oracle数据库岗位职责
  16. GitHub上12k Star的《Java工程师成神之路》终于开放阅读了!
  17. PHP excel 直接输出导出
  18. 压电式雨量传感器介绍说明
  19. 0204隐函数及由参数方程所确定的函数的导数相关变化率-导数与微分
  20. 钟汉良日记:为何我持续写日记四十天后,让他精神层面完全被影响?

热门文章

  1. 世界上最奇异的10种树,你都见过吗?
  2. 假如人类长出翅膀,会变成这种怪样子
  3. 这几道挑战极限的烧脑题,烧脑到爽爽爽爽爽!
  4. sqlyog怎么设置默认值_物联网卡三网APN设置
  5. python能不能自动写代码_微软最强 Python 自动化工具开源了!不用写一行代码
  6. node 16位 转24位_同时将24位和32位BMP图像顺时针旋转90度
  7. php2612,达人曝光LGLSNJ2612AR质量好吗?怎么样呢?体验报告揭秘
  8. 后端返回number类型数据_Javascript基础教程之数据类型 (数值 Number)
  9. java 监听文件内容_java 监听文件内容变化
  10. 算法题目——电梯(HDU-1008)