题目链接:https://acm.ecnu.edu.cn/contest/173/problem/E/

题意:Description 小花梨得到了一个长度为?的数组?,现在要对它进行三种操作:

⚫ 1 ? ? 对所有的? ∈ [?, ?], ?[?] = ?[?] ∗ ????????(?[?])

⚫ 2 ? ? 对所有的? ∈ [?, ?], ?[?] = ?[?] / ????????(?[?])

⚫ 3 ? 求?[?]的值 ????????(?) = { 1 (? = 1) ?的最小素因子(? ≥ 2)

现在给出初始数组?,对其进行?次操作,对于第三种操作输出结果。 Input 第一行输入两个正整数?, ?,表示数组的长度以及操作次数(1 ≤ ?, ? ≤ 100000) 第二行输入?个正整数表示数组?(1 ≤ ?? ≤ 1000000) 接下来?行表示?次操作,每行输入格式为"1 ? ?"或者"2 ? ?",或者"3 ?",对应上述三种操作。 1 ≤ ?, ?, ? ≤ ?, ? ≤ �

题解:线段树维护区间乘除操作,之前为乘的时候,直接操作即可,若之前为除,那就先pushdown,在操作

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int N=1e5+10;
int ok[N*10];
int prime[N*10],len;
int a[N],num[N];
ll ksm(ll x,ll y)
{ll res=1;while(y){if(y&1) res=res*x%mod;y>>=1;x=x*x%mod;}return res;
}
void init()
{ok[1]=1;for(int i=2;i<=1000000;i++){if(!ok[i]){prime[len++]=i;}for(int j=0;j<len&&(ll)prime[j]*i<=1000000;j++){ok[prime[j]*i]=1;if(i%prime[j]==0)break;}}
}
struct node{int l,r;int num[12];int sum[12];int laz;int len;
}tree[N<<2];
int n,m;
void build(int l,int r,int cur)
{tree[cur].l=l;tree[cur].r=r;tree[cur].laz=0;tree[cur].len=0;if(l==r){int x;scanf("%d",&x);if(x==1){tree[cur].num[1]=1;tree[cur].sum[1]=1;}else{for(int j=0;j*j<=x;j++){if(x%prime[j]==0){tree[cur].num[++tree[cur].len]=prime[j];while(x%prime[j]==0){x=x/prime[j];tree[cur].sum[tree[cur].len]++;}// cout<<tree[cur].num[tree[cur].len]<<" "<<tree[cur].sum[tree[cur].len]<<endl;}}if(x!=1){tree[cur].num[++tree[cur].len]=x;tree[cur].sum[tree[cur].len]=1;//    a[++cnt]=x;//    num[cnt]=1;}tree[cur].num[++tree[cur].len]=1;tree[cur].sum[tree[cur].len]=1;}tree[cur].len=1;return;}int mid=(r+l)>>1;build(l,mid,cur<<1);build(mid+1,r,cur<<1|1);
}
void pushdown(int cur)
{if(tree[cur].laz!=0){if(tree[cur<<1].l==tree[cur<<1].r){tree[cur<<1].sum[tree[cur<<1].len]+=tree[cur].laz;while(tree[cur<<1].sum[tree[cur<<1].len]<=0 && tree[cur<<1].num[tree[cur<<1].len]!=1){tree[cur<<1].sum[tree[cur<<1].len+1]+=tree[cur<<1].sum[tree[cur<<1].len];tree[cur<<1].len++;}}else{if(tree[cur<<1].laz>=0 ) tree[cur<<1].laz+=tree[cur].laz;else{pushdown(cur<<1);tree[cur<<1].laz=tree[cur].laz;}}if(tree[cur<<1|1].l==tree[cur<<1|1].r){tree[cur<<1|1].sum[tree[cur<<1|1].len]+=tree[cur].laz;while(tree[cur<<1|1].sum[tree[cur<<1|1].len]<=0 && tree[cur<<1|1].num[tree[cur<<1|1].len]!=1){tree[cur<<1|1].sum[tree[cur<<1|1].len+1]+=tree[cur<<1|1].sum[tree[cur<<1|1].len];tree[cur<<1|1].len++;}}else{if(tree[cur<<1|1].laz>=0) tree[cur<<1|1].laz+=tree[cur].laz;else{pushdown(cur<<1|1);tree[cur<<1|1].laz=tree[cur].laz;}}tree[cur].laz=0;}
}
void update(int pl,int pr,int cur,int val)
{if(pl<=tree[cur].l && tree[cur].r<=pr){if(tree[cur].l==tree[cur].r){tree[cur].sum[tree[cur].len]+=val;while(tree[cur].sum[tree[cur].len]<=0 && tree[cur].num[tree[cur].len]!=1){tree[cur].sum[tree[cur].len+1]+=tree[cur].sum[tree[cur].len];tree[cur].len++;}}else{if(tree[cur].laz>=0) tree[cur].laz+=val;else{pushdown(cur);tree[cur].laz=val;}}return;}pushdown(cur);if(pl<=tree[cur<<1].r) update(pl,pr,cur<<1,val);if(pr>=tree[cur<<1|1].l) update(pl,pr,cur<<1|1,val);
}
ll query(int pos,int cur)
{
//  cout<<tree[cur].l<<" "<<tree[cur].r<<endl;if(tree[cur].l==tree[cur].r){ll x=1;if(tree[cur].num[tree[cur].len]==1)return 1;for(int i=tree[cur].len;tree[cur].num[i]!=1;i++){//        cout<<tree[cur].num[i]<<" "<<tree[cur].sum[i]<<endl;x=x*ksm(tree[cur].num[i],tree[cur].sum[i])%mod;}return x;}pushdown(cur);if(pos<=tree[cur<<1].r) return query(pos,cur<<1);else return query(pos,cur<<1|1);
}
int main()
{init();int x;int cnt;scanf("%d%d",&n,&m);build(1,n,1);int op,l,r;while(m--){scanf("%d",&op);if(op==1){scanf("%d%d",&l,&r);update(l,r,1,1);}else if(op==2){scanf("%d%d",&l,&r);update(l,r,1,-1);}else{scanf("%d",&x);printf("%lld\n",query(x,1));}}return 0;
}

“美登杯”上海市高校大学生程序设计邀请赛 (华东理工大学)E. 小花梨的数组相关推荐

  1. “美登杯”上海市高校大学生程序设计邀请赛 (华东理工大学)

    Problem A 小花梨的字符串 https://acm.ecnu.edu.cn/contest/173/problem/A/ 题意:对区间子字符串排列,使得满足条件,求排列最长. 题解: C++版 ...

  2. 小花梨判连通(DFS或BFS或并查集+vector+map)——“美登杯”上海市高校大学生程序设计邀请赛 (华东理工大学)

    (https://acm.ecnu.edu.cn/contest/173/problem/C/) 题目大意: 小花梨给出?个点,让?位同学对这?个点任意添加无向边,构成?张图.小花梨想知道对于每个点? ...

  3. “美登杯”上海市高校大学生程序设计邀请赛 **D. 小花梨的取石子游戏**

    "美登杯"上海市高校大学生程序设计邀请赛 (华东理工大学) D. 小花梨的取石子游戏 Description 小花梨有?堆石子,第?堆石子数量为??,?堆石子顺时针编号为1 − ? ...

  4. 美登杯”上海市高校大学生程序设计邀请赛 Problem E 、 小 花梨 的数组 (线段树)...

    Problem E E . 小 花梨 的数组 时间限制:1000ms 空间限制:512MB Description 小花梨得到了一个长度为?的数组?,现在要对它进行三种操作: ⚫ 1 ? ] ∗ ⚫ ...

  5. “美登杯”上海市高校大学生程序设计邀请赛(华东理工大学) 小花梨的取石子游戏(博弈)

    Description 小花梨有?堆石子,第?堆石子数量为??,?堆石子顺时针编号为1 − ?(如图) . 游戏将进行?轮,每轮游戏单独进行,互不干扰,每轮初始时第?堆石子数目为??. 第?轮从编号为 ...

  6. “美登杯”上海市高校大学生程序设计 C. 小花梨判连通 (并查集+map)

    Problem C C . 小 花梨 判连通 时间限制:2000ms 空间限制:512MB Description 小花梨给出?个点,让?位同学对这?个点任意添加无向边,构成?张图.小花梨想知道对于 ...

  7. “美登杯”上海市高校大学生程序设计赛B. 小花梨的三角形(模拟,实现)

    题目链接:https://acm.ecnu.edu.cn/contest/173/problem/B/#report9 Problem B B . 小 花梨 的 三角形 时间限制:1000ms 空间限 ...

  8. 上海市高校大学生程序设计邀请赛 C:小花梨判连通

    上海市高校大学生程序设计邀请赛 C:小花梨判连通 Problem C.小花梨判连通 时间限制:2000ms 空间限制:512MB Description 小花梨给出?个点,让?位同学对这?个点任意添加 ...

  9. 字节跳动杯2018中国大学生程序设计竞赛-女生专场题解

    以下所有AC题解程序来自"仙客传奇"团队. A. 口算训练 题解链接: ABDFHK "字节跳动杯"2018中国大学生程序设计竞赛-女生专场 B. 缺失的数据范 ...

最新文章

  1. 解决QT出现XXXX.dll不能加载问题
  2. 数据结构与算法 | 二叉树的实现
  3. SMSSMS垃圾邮件检测器的专业攻击
  4. Programe_Of_Beauty:2.14 求数组的子数组之和的最大值
  5. java实现验证码登录
  6. [转]3D Ripper DX模型截取器
  7. Jmeter压力测试实验 (软件测试实验报告)
  8. 假如现在你有30分钟,你会做什么?
  9. 从月薪3500到700万——一个大学生的成长经历
  10. LeetCode1619删除某些元素后的数组均值(java)
  11. 网站运营的9个常用搜索技巧
  12. 哪些著名软件是用C、C++编写的?
  13. linux pdf 笔记软件,可以编辑在PDF上做笔记的笔记软件:Xournal
  14. python爬虫去哪儿网_用python爬虫爬取去哪儿4500个热门景点,看看国庆不能去哪儿...
  15. 腾讯云简单使用-Python
  16. 如何下载通州区卫星地图高清版大图
  17. windows下安装 Linux Ubuntu20. 04双系统
  18. 网吧XP系统母盘制作参考(1)
  19. Commvault Complete™ Backup Recovery v11 SP18 OVF 下载
  20. InDesign 教程:如何在 InDesign 中使用的不同类型的框架?

热门文章

  1. 万国数据登陆纳斯达克 宣布首次公开发行股票定价
  2. html最快学会的方式,零基础HTML玩家的Bootstrap入门第一课(保证学会!)
  3. Vue.js:使用v-bind为多个元素绑定style样式案例
  4. 再度联手中国联通,开启第二个五年战略合作!
  5. 2017国产品牌台式计算机,2017三大热门国产平板电脑推荐
  6. 重t2加权是什么意思_魔兽世界怀旧服:为什么BWL打不腻,TAQ没多久大家都AFK了?...
  7. python中双等号与单等号的区别_双等号 == 与单等号 =
  8. MainWindow.xaml.cs
  9. 看完面经,他拿出一打大厂offer玩起了斗地主,人生不过是如此枯燥乏味....
  10. 2022年5月8日 解决手机连接电脑无法选择“传输文件”