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. (selenium+python)_UI自动化01_Mac下selenium环境搭建

    前言 Selenium 是一个用于Web网页UI自动化测试的开源框架,可以驱动浏览器模拟用户操作.支持多种平台(Windows.Mac OS.Linux)和多种浏览器(IE.Firefox.Chrom ...

  2. 20190905 Lombok常用注解

    Lombok常用注解 val 用于声明类型,将从初始化表达式推断出类型,仅适用于局部变量和foreach循环,而不适用于字段.声明的局部变量为final变量. Java自带类型推断随着JDK版本提升越 ...

  3. js模块化编程之CommonJS和AMD/CMD!

    有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块. 但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写法,岂不是乱了套! 于是下面三个模块 ...

  4. js技巧之与或运算符 || && 妙用

    如题: 假设对成长速度显示规定如下: 成长速度为5显示1个箭头:  成长速度为10显示2个箭头:  成长速度为12显示3个箭头:  成长速度为15显示4个箭头:  其他都显示都显示0各箭头.  用代码 ...

  5. css:设置div边框透明+渐变

    写作背景: 觅兼职--登陆页面,UI给的原型图很漂亮,其中有一个图要求div外面有一圈透明度为0.37且带有渐变的边框.效果图如下: 在写的时候遇到了一点小小的问题:无法给同一个div设置圆角的透明+ ...

  6. NFS实现文件共享

    NFS(Network Files System)即网络文件系统,NFS文件系统协议允许网络中的主机通过TCP/IP协议进行资源共享,NFS客户端可以像使用本地资源一样读写远端NFS服务端的资料,需要 ...

  7. SpringBoot(七) -- 嵌入式Servlet容器

    一.嵌入式Servlet容器 在传统的开发中,我们在完成开发后需要将项目打成war包,在外部配置好TomCat容器,而这个TomCat就是Servlet容器.在使用SpringBoot开发时,我们无需 ...

  8. STM32 RTC

    目前较为实用的RTC时钟源选择的是:32.768k LSE 低速外部时钟: 不建议实用LSI,精度不高,对时间精度要求不高的可以考虑实用LSI时钟源.数据手册上电气特性的数据:

  9. [BZOJ 2989]数列(CDQ 分治+曼哈顿距离与切比雪夫距离的转化)

    [BZOJ 2989]数列(CDQ 分治) 题面 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[y]| ...

  10. 游戏服务端pomelo完整安装配置过程

    版权声明:本文为博主原创文章,转载或又一次发表请先与我联系. https://blog.csdn.net/jonahzheng/article/details/27658985 游戏服务端pomelo ...