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. 剑指offer--day01

    1.1题目:二维数组中的查找:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断 ...

  2. docker--虚拟化

    1 什么是虚拟化 1.1 概念 在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种 实体资源,如服务器.网络.内存及存储等,予以抽象.转换后呈现出来,打破实体 ...

  3. Leveldb源码分析--2

    coming from http://blog.csdn.net/sparkliang/article/details/8573618

  4. Ubuntu 12.04安装Gitlab及问题解决

    最近看了下Git,并且之前听同学说过gitlab这个东西,就想自己也搭建一个gitlab,做一个像github那样的代码管理站点,现在的gitlab要安装确实是非常非常方便, https://abou ...

  5. SUSTOJ_路痴的单身小涵(图中最短路的条数)

    去年因为太low没有做出来校赛的最后一题,遂今年校赛做了这个题,下面我做详细描述. 原题链接 本题大意:给定一个无向图G,每个边的权值为1,图中L表示起点,C表示终点,#表示未通路,给定时间k,让你判 ...

  6. servlet到springmvc的演进

    1.简单看看servlet 1.1.servlet继承关系 先看看下面servlet的这个继承关系,有点印象即可(可以暂时忽略ServletConfig,这个接口就是让我们可以从web.xml文件中拿 ...

  7. JUC并发包基本使用

    一.简介 传统的Java多线程开发中,wait.notify.synchronized等如果不注意使用的话,很容易引起死锁.脏读问题.Java1.5 版本开始增加 java.util.concurre ...

  8. python实现不同条件下单据体的颜色不一样,比如直接成本分析表中关闭的细目显示为黄色

    #引入clr运行库 import clr #添加对cloud插件开发的常用组件的引用 clr.AddReference('Kingdee.BOS') clr.AddReference('Kingdee ...

  9. Dubbo源码学习总结系列三 dubbo-cluster集群模块

    Dubbo集群模块的目的是将集群Invokers构造一个透明的Invoker对象,其中包含了容错机制.负载均衡.目录服务(服务地址集合).路由机制等,为RPC层提供高可用.高并发.自动发现.可治理的S ...

  10. 不想用ubuntu了,换个系统manjaro - change

    # 下载 https://mirrors.tuna.tsinghua.edu.cn/osdn/storage/g/m/ma/manjaro/xfce/ # usb启动盘 rufus # 中文字体 pa ...