“美登杯”上海市高校大学生程序设计 E. 小花梨的数组 (线段树)
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. 小花梨的数组 (线段树)的更多相关文章
- “美登杯”上海市高校大学生程序设计 C. 小花梨判连通 (并查集+map)
Problem C C . 小 花梨 判连通 时间限制:2000ms 空间限制:512MB Description 小花梨给出
- “美登杯”上海市高校大学生程序设计邀请赛 **D. 小花梨的取石子游戏**
"美登杯"上海市高校大学生程序设计邀请赛 (华东理工大学) D. 小花梨的取石子游戏 Description 小花梨有
- 美登杯”上海市高校大学生程序设计邀请赛 Problem E 、 小 花梨 的数组 (线段树)
Problem E E . 小 花梨 的数组 时间限制:1000ms 空间限制:512MB Description 小花梨得到了一个长度为
- “美登杯”上海市高校大学生程序设计赛B. 小花梨的三角形(模拟,实现)
题目链接:https://acm.ecnu.edu.cn/contest/173/problem/B/#report9 Problem B B . 小 花梨 的 三角形 时间限制:1000ms 空间限 ...
- “美登杯”上海市高校大学生程序设计邀请赛 (华东理工大学) E 小花梨的数组 线段树
题意 分析 预处理出每个数的最小素因子,首先可以知道\(minprime(x*minprime(x))=minprime(x)\),我们用线段树维护区间最大值\(mx[p]\),注意这里的最大值并不是 ...
- "字节跳动杯"2018中国大学生程序设计竞赛-女生专场 Solution
A - 口算训练 题意:询问 $[L, R]$区间内 的所有数的乘积是否是D的倍数 思路:考虑分解质因数 显然,一个数$x > \sqrt{x} 的质因子只有一个$ 那么我们考虑将小于$\sqr ...
- "字节跳动杯"2018中国大学生程序设计竞赛-女生专场
口算训练 #include <iostream> #include <algorithm> #include <cstring> #include <cstd ...
- 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 ...
- 第十一届GPCT杯大学生程序设计大赛完美闭幕
刚刚过去的周六(6月7号)是今年高考的第一天,同一时候也是GPCT杯大学生程序设计大赛颁奖的日子,以下我们用图文再回想一下本次大赛颁奖的过程. 评审过程的一些花絮<感谢各位评审这些天的付出!&g ...
随机推荐
- 【SD系列】SAP SD模块-公司间销售简介
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[SD系列]SAP SD模块-公司间销售简介 ...
- ecshop启用gzip后,后台不能打开不能访问的问题
上传测试的时候,站点显示无法打开.随后我用网址打开根目录的robots文件.图片.静态页···全部可以正常打开··· 我尴尬···一一检查后,我就怀疑是不是客户当初设置gzip压缩的问题了.但连后台都 ...
- EasyUI选项卡避免重复打开
前台代码: <div data-options="region:'west',title:'我的工作平台',split:true,iconCls:'icon-desk'" ...
- Angular5 import interface 报错:XXX is not a module
在项目里定义了一个interface,device.ts.然后在component.ts中要使用这个interface,import之后,VSCode报错:‘xxx/xxx/xxx/device.ts ...
- pytony格式化输出-占位符
1. %s s = string 字符串 2. %d d = digit 整数 3. %f f = float 浮点数 #!/usr/bin/env python #_*_coding:utf-8_* ...
- AI会议网站
<麻省理工科技评论>新兴科技峰会EmTech China : http://www.emtechchina.cn/ IT大咖说 各种科技前沿会议发布站 : http://www.itdks ...
- CENTOS6.5 编译安装MySQL5.7.14
前言 mysql5.7.14 编译安装在自定义文件路径下 下载安装包 配置安装环境 编译安装 cmake \ -DCMAKE_INSTALL_PREFIX=/data/db5714 \ -DMYSQL ...
- 创建Spring Boot微服务项目
创建一个测试用的微服务项目HelloWorld 创建项目 编写服务代码 @RestController public class HelloWorld { @RequestMapping(" ...
- [集合]java中的 可变参数
可变的参数类型,也称为不定参数类型.英文缩写是varargus,还原一下就是variable argument type.通过它的名字可以很直接地看出来,这个方法在接收参数的时候,个数是不定的. pu ...
- 7、 正则化(Regularization)
7.1 过拟合的问题 到现在为止,我们已经学习了几种不同的学习算法,包括线性回归和逻辑回归,它们能够有效地解决许多问题,但是当将它们应用到某些特定的机器学习应用时,会遇到过拟合(over-fittin ...