https://acm.ecnu.edu.cn/contest/173/problem/E/

分析:

考虑这样一种情况,如果对一个点连续地做几次乘操作,那么之后紧跟着的除操作只需要将乘操作的次数减少即可。(因为如果当前是乘于的最小素因子后面肯定也是除上这个)

那么对这个点的操作将会变成连续的一段乘或者除。如果一段除操作之后出现了乘操作,那只能在一段除之后做一段乘操作了,因为执行了除之后minprime可能会变化。(很显然)

所以最后对这个点的操作将会变成一段除操作跟着一段乘操作。

那么就可以利用线段树维护这样一段操作的除乘的个数了。线段树每个节点维护两个信息:除操作个数,乘操作个数

收获:对线段树的强大操作再一次的认识了!

#include<bits/stdc++.h>
using namespace std;
#define lc ((o) << 1)
#define rc ((o) << 1 | 1)
#define ll long long
const int N = ;
const int MOD = 1e9+;
int Mul[N<<],Div[N<<],a[N]; void powndown(int o , int l , int r)
{
if(Mul[o] || Div[o])
{
if(Mul[lc]>=Div[o])
{
Mul[lc]-=Div[o];
}
else
{
Div[lc]+=(Div[o]-Mul[lc]);
Mul[lc]=;
} if(Mul[rc]>=Div[o])
{
Mul[rc]-=Div[o];
}
else
{
Div[rc]+=(Div[o]-Mul[rc]);
Mul[rc]=;
}
Mul[lc]+=Mul[o];
Mul[rc]+=Mul[o];
Mul[o]=Div[o]=;
}
}
void update(int o, int l, int r, int L, int R, int tree[], int op)
{
if(L <= l && R >= r)
{
if(op == )tree[o]++;
else
{
if(Mul[o])Mul[o]--;
else tree[o]++;
}
return;
}
powndown(o, l, r);
int m = (l + r) / ;
if(L <= m)update(lc, l, m, L, R, tree, op);
if(R > m)update(rc, m + , r, L, R, tree, op);
} void query(int o, int l, int r, int x, int& divnum, int& mulnum)
{
if(l == r)
{
divnum = Div[o];
mulnum = Mul[o];
return;
}
powndown(o, l, r);
int m = (l + r) / ;
if(x <= m)query(lc, l, m, x, divnum, mulnum);
else query(rc, m + , r, x, divnum, mulnum);
}
int tot;
bool vis[N];
int pr[N];
void init()
{
tot=;
for(int i= ; i<=N ; i++)
{
if(vis[i]==)
{
pr[++tot]=i;
//cout<<i<<" "<<pr[10]<<endl;
for(int j=*i;j<=N;j+=i)
vis[j]=;
}
}
}
vector<int>FA[N];
ll POW(ll x , ll y)
{
ll ans=;
while(y)
{
if(y&) ans=ans*x%MOD;
y>>=;
x=x*x%MOD;
}
return ans;
}
int main()
{ int n,m;scanf("%d%d",&n,&m);
init();
//cout<<pr[1]<<" "<<pr[2]<<endl;
for(int i= ; i<=n ; i++)
{
scanf("%d",&a[i]);
int x=a[i]; for(int j= ; j<=tot&&pr[j]*pr[j]<=x;j++)
{
while(x%pr[j]==)
{
x/=pr[j];
FA[i].push_back(pr[j]);
} }
if(x!=) FA[i].push_back(x);
// cout<<FA[i].size()<<endl;
} while(m--)
{
int op,l,r;scanf("%d",&op);
if(op==)
{
scanf("%d%d",&l,&r);
update(,,n,l,r,Mul,);
}
else if(op==)
{
scanf("%d%d",&l,&r);
update(,,n,l,r,Div,);
}
else
{
scanf("%d",&l);
int numMul=,numDiv=;
query(,,n,l,numDiv,numMul);
// cout<<numDiv<<" "<<numMul<<endl;
// cout<<FA[l].size()<<endl;
if(numDiv>=FA[l].size())
{
puts("");
}
else
{
ll ans=,tmp=FA[l][numDiv]; for(int i=numDiv ; i<FA[l].size();i++)
ans=(ans*(1ll*FA[l][i]))%MOD;
ans=(ans*POW(tmp,numMul))%MOD;
printf("%lld\n",ans);
}
}
}
}

“美登杯”上海市高校大学生程序设计 E. 小花梨的数组 (线段树)的更多相关文章

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

    Problem C C . 小 花梨 判连通 时间限制:2000ms 空间限制:512MB Description 小花梨给出

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

    "美登杯"上海市高校大学生程序设计邀请赛 (华东理工大学) D. 小花梨的取石子游戏 Description 小花梨有

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

    Problem E E . 小 花梨 的数组 时间限制:1000ms 空间限制:512MB Description 小花梨得到了一个长度为

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

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

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

    题意 分析 预处理出每个数的最小素因子,首先可以知道\(minprime(x*minprime(x))=minprime(x)\),我们用线段树维护区间最大值\(mx[p]\),注意这里的最大值并不是 ...

  6. "字节跳动杯"2018中国大学生程序设计竞赛-女生专场 Solution

    A - 口算训练 题意:询问 $[L, R]$区间内 的所有数的乘积是否是D的倍数 思路:考虑分解质因数 显然,一个数$x > \sqrt{x} 的质因子只有一个$ 那么我们考虑将小于$\sqr ...

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

    口算训练 #include <iostream> #include <algorithm> #include <cstring> #include <cstd ...

  8. fzu 2105 Digits Count ( 线段树 ) from 第三届福建省大学生程序设计竞赛

    http://acm.fzu.edu.cn/problem.php?pid=2105 Problem Description Given N integers A={A[0],A[1],...,A[N ...

  9. 第十一届GPCT杯大学生程序设计大赛完美闭幕

    刚刚过去的周六(6月7号)是今年高考的第一天,同一时候也是GPCT杯大学生程序设计大赛颁奖的日子,以下我们用图文再回想一下本次大赛颁奖的过程. 评审过程的一些花絮<感谢各位评审这些天的付出!&g ...

随机推荐

  1. layer.msg()自动关闭后刷新页面

    layer.msg("2秒就消失哦", { time: 2000 }, function () {                    window.location.href ...

  2. 虚拟机 vs 容器

    虚拟机 虚拟机本质上是模拟,模拟物理机上的硬件 虚拟机必须安装操作系统 一个虚拟机操作系统的崩溃不会影响到其他虚拟机 容器 容器的本质是经过隔离与限制的linux进程 容器使用的是物理机的资源 容器之 ...

  3. “希希敬敬对”队软件工程第九次作业-beta冲刺第一次随笔

    队名:  “希希敬敬对” 龙江腾(队长) 201810775001 杨希                   201810812008 何敬上 201810812004 今日讨论会议照片一张: 每个人 ...

  4. python字典使用总结

    作者:python技术人 博客:https://www.cnblogs.com/lpdeboke 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值 key=>value 对用冒号 ...

  5. 2019 Multi-University Training Contest 4 - 1010 - Minimal Power of Prime

    http://acm.hdu.edu.cn/showproblem.php?pid=6623 题意,给50000个1e18级别的数N,求它质因数分解里面的最小的指数(不算0) 比赛的时候给划了一个1e ...

  6. ASP.NET MVC @html帮助类

    原文:https://www.cnblogs.com/caofangsheng/p/10462494.html HTML Helpers是用来创建HTML标签进而创建HTML控件的.HTML Help ...

  7. SSM商城系统开发笔记-配置01-web.xml

    先占坑 慢慢填, 商城系统使用主体框架:Spring + Spring MVC + Mybatis 其他框架: 日志: slf4j + logback <!DOCTYPE web-app PUB ...

  8. Rsync安装部署

    Rsync安装部署 1.Rsync  简介 Rsync  是一款开源的.快速的 多功能的 可以实现全量以及增量的本地或者是远程的数据同步备份的优秀工具,并且可以不进行改变原有的数据属性信息,实现数据的 ...

  9. linux Sersync 上配置客户端

    1.安装 Rsync 并配置相关权限 在 SERSYNC 上配置 RSYNC 客户端相关权限认证: [root@SERSYNC /]# yum install rsync -y [root@SERSY ...

  10. linux加大服务器文件描述符

    最简单的说,在 unix/liux 里面,你的服务只要开启一个进程,就要占用文件描述符的.liunx 默认 是 1024,如果描述符少了,你的访问量多了,你的服务器支撑不了,所以要把描述符加大. #e ...