洛谷 P4256 公主の#19准备月考
题目背景
公主在玩完游戏后,也要月考了。(就算是公主也要月考啊QWQ)
题目描述
公主的文综太差了,全校排名1100+(全校就1100多人),她分析了好久,发现她如果把所有时间放在选择题上,得分会比较好一点。
文综题目共有n个,编号从1到n
公主给每个题目算出来了一个预估值Ai,她认为,一段连续题目的答案会在它们的预估值的gcd和lcm之间;有时候她的想法不同了,一些题目的预估值会改变;有时候,会出现多选题,多选题的答案数量就是一段连续题目答案的预估值的公约数的个数。
具体来说,对于一个数列,有四种操作:
L x y p 表示公主询问区间[x,y]的数字的lcm对p取模之后的值
G x y p 表示公主询问区间[x,y]的数字的gcd对p取模之后的值
C x y c 表示公主改变区间[x,y]的数字的值,统一为c
S x y p 表示公主询问区间[x,y]的数字的公因数个数对p取模之后的值
公主月考不能挂科,不然她就不能学习OI了(假的),所以请你帮帮她吧!
输入输出格式
输入格式:
第一行,两个正整数n和q,q表示操作次数
第二行,n个正整数,表示dkw对题目的预估值
接下来q行,每行输入一个操作,格式详见题目描述
输出格式:
对于每个询问,输出它的答案。
输入输出样例
10 10
42 68 35 1 70 25 79 59 63 65
L 2 6 28
L 2 6 43
G 2 7 5
G 3 4 83
L 7 9 96
G 2 7 39
S 3 8 100
L 4 5 12
G 4 4 65
L 2 4 69
0
32
1
1
75
1
1
10
1
34
说明
对于30%的数据,1<=n,q<=1000
对于另外20%的数据,1<=n<=1000,1<=q<=100000
对于另外20%的数据,1<=n<=100000,1<=q<=100000,保证没有修改操作
对于100%的数据,1<=n<=300000,1<=q<=300000
保证任何时刻每个题目的预估值都在[1,100]之间,答案取模之后不超过int
最重要的性质是所有数不超过100,所以只有25个质因子。
我们只需要维护一下这25个质因子的质数在区间的min和max就行了。
然后我就卡着常数过去了哈哈哈

#include<bits/stdc++.h>
#define ll long long
#define maxn 300005
#define pb push_back
using namespace std;
int zs[30],t=0,d[105];
bool v[105];
int ci[105][30];
int tmp[30][30];
struct node{
int mx[30],mn[30],tag;
node operator +(const node &u)const{
node r;
r.tag=0;
for(int i=1;i<=t;i++){
r.mx[i]=max(mx[i],u.mx[i]);
r.mn[i]=min(mn[i],u.mn[i]);
}
return r;
} inline void clear(){
memset(mx,0,sizeof(mx));
memset(mn,0x3f,sizeof(mn));
tag=0;
}
}b[maxn<<2|1],AN; inline void init(){
for(int i=2;i<=100;i++){
if(!v[i]) zs[++t]=i,ci[i][t]=1;
for(int j=1,u;j<=t&&(u=zs[j]*i)<=100;j++){
v[u]=1;
memcpy(ci[u],ci[i],sizeof(ci[i]));
ci[u][j]++;
if(!(i%zs[j])) break;
}
}
/*
for(int i=1;i<=100;i++){
for(int j=1;j<=t;j++) printf("%d ",ci[i][j]);
puts("");
}
*/ for(int i=1;i<=100;i++)
for(int j=i;j<=100;j+=i) d[j]++; for(int i=1;i<=t;i++){
tmp[i][0]=1;
for(int j=1;;j++){
tmp[i][j]=tmp[i][j-1]*zs[i];
if(tmp[i][j]>100) break;
}
}
} int n,m,a[maxn],p;
int opt,le,ri,w;
char ch; inline void work(int o,int val){
b[o].tag=val;
for(int i=1;i<=t;i++) b[o].mn[i]=b[o].mx[i]=ci[val][i];
} inline void pushdown(int o,int lc,int rc){
if(b[o].tag){
work(lc,b[o].tag);
work(rc,b[o].tag);
b[o].tag=0;
}
} void build(int o,int l,int r){
if(l==r){
for(int i=1;i<=t;i++) b[o].mn[i]=b[o].mx[i]=ci[a[l]][i];
b[o].tag=0;
return;
} int mid=l+r>>1,lc=o<<1,rc=(o<<1)|1;
build(lc,l,mid);
build(rc,mid+1,r); b[o]=b[lc]+b[rc];
} void update(int o,int l,int r){
if(l>=le&&r<=ri){
work(o,w);
return;
} int mid=l+r>>1,lc=o<<1,rc=(o<<1)|1;
pushdown(o,lc,rc);
if(le<=mid) update(lc,l,mid);
if(ri>mid) update(rc,mid+1,r); b[o]=b[lc]+b[rc];
} void query(int o,int l,int r){
if(l>=le&&r<=ri){
AN=AN+b[o];
return;
} int mid=l+r>>1,lc=o<<1,rc=(o<<1)|1;
pushdown(o,lc,rc);
if(le<=mid) query(lc,l,mid);
if(ri>mid) query(rc,mid+1,r);
} int main(){
init();
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",a+i);
build(1,1,n); while(m--){
ch=getchar();
while(ch!='L'&&ch!='G'&&ch!='C'&&ch!='S') ch=getchar();
scanf("%d%d%d",&le,&ri,&p);
if(ch=='C'){
w=p;
update(1,1,n);
}
else if(ch=='S'){
AN.clear();
query(1,1,n);
int gcd=1;
for(int i=1;i<=t;i++) gcd=gcd*tmp[i][AN.mn[i]];
printf("%d\n",d[gcd]%p);
}
else if(ch=='L'){
AN.clear();
query(1,1,n);
int lcm=1;
const int ha=p;
for(int i=1;i<=t;i++) lcm=lcm*(ll)tmp[i][AN.mx[i]]%ha;
printf("%d\n",lcm);
}
else{
AN.clear();
query(1,1,n);
int gcd=1;
for(int i=1;i<=t;i++) gcd=gcd*tmp[i][AN.mn[i]];
printf("%d\n",gcd%p);
}
} return 0;
}
洛谷 P4256 公主の#19准备月考的更多相关文章
- 洛谷.5284.[十二省联考2019]字符串问题(后缀自动机 拓扑 DP)
		
LOJ BZOJ 洛谷 对这题无话可说,确实比较...裸... 像dls说的拿拓扑和parent树一套就能出出来了... 另外表示BZOJ Rank1 tql... 暴力的话,由每个\(A_i\)向它 ...
 - 洛谷.5283.[十二省联考2019]异或粽子(可持久化Trie 堆)
		
LOJ 洛谷 考场上都拍上了,8:50才发现我读错了题=-= 两天都读错题...醉惹... \(Solution1\) 先求一遍前缀异或和. 假设左端点是\(i\),那么我们要在\([i,n]\)中找 ...
 - LOJ 2743(洛谷 4365) 「九省联考 2018」秘密袭击——整体DP+插值思想
		
题目:https://loj.ac/problem/2473 https://www.luogu.org/problemnew/show/P4365 参考:https://blog.csdn.net/ ...
 - bzoj5248(洛谷4363)(2018九省联考)一双木棋
		
题目:https://www.luogu.org/problemnew/show/P4363 一种考虑状态数的方法:有几个用了k个格子的列,就在第k个0的左边插入几个1: 这也是求不降序列的个数的方法 ...
 - 【洛谷P3749】[六省联考2017]寿司餐厅(网络流)
		
洛谷 题意: 给出\(n\)份寿司,现可以选取任意多次连续区间内的寿司,对于区间\([l,r]\),那么贡献为\(\sum_{i=l}^r \sum_{j=i}^rd_{i,j}\)(对于相同的\(d ...
 - 洛谷P5289 [十二省联考2019]皮配(01背包)
		
啊啊啊边界判错了搞死我了QAQ 这题是一个想起来很休闲写起来很恶心的背包 对于\(k=0\)的情况,可以发现选阵营和选派系是独立的,对选城市选阵营和学校选派系分别跑一遍01背包就行了 对于\(k> ...
 - 洛谷P5284 [十二省联考2019]字符串问题 [后缀树]
		
传送门 思路 设\(dp_i\)表示以\(i\)结尾的\(A\)串,能达到的最长长度. 然后发现这显然可以\(i\)往自己控制的\(k\)连边,\(k\)往能匹配的\(j\)连边,就是个最长路,只要建 ...
 - 洛谷 5291 [十二省联考2019]希望(52分)——思路+树形DP
		
题目:https://www.luogu.org/problemnew/show/P5291 考场上写了 16 分的.不过只得了 4 分. 对于一个救援范围,其中合法的点集也是一个连通块. 2n 枚举 ...
 - 洛谷P5284 [十二省联考2019]字符串问题(SAM+倍增+最长路)
		
题面 传送门 题解 首先,我们把串反过来,那么前缀就变成后缀,建一个\(SAM\).我们发现一个节点的后缀是它的所有祖先 那么我们是不是直接按着\(parent\)树建边就可以了呢? 显然不是.我们假 ...
 
随机推荐
- WPF异步回调时回调函数如何获取异步函数产生的变量
			
有这么一个问题,WPF在使用异步回调的时候,回调函数需要用到异步函数里产生的一个变量,例如异步函数里查询数据库得到了一个DataTable,如何传递给回调函数呢? [方案一]使用全局变量 很容易想到的 ...
 - 【MySQL】资源列表
			
1.使用yum方式安装MySQL https://blog.csdn.net/zl570932980/article/details/78934601 2.安装Xtrabackup备份工具 https ...
 - RDD算子、RDD依赖关系
			
RDD:弹性分布式数据集, 是分布式内存的一个抽象概念 RDD:1.一个分区的集合, 2.是计算每个分区的函数 , 3.RDD之间有依赖关系 4.一个对于key-value的RDD的Partit ...
 - datagrid的修改和删除功能的实现
			
1.修改 双击,进入一行的编辑状态的功能的实现 2.删除 3.扩展easyui的datagrid,添加动态增加或删除Editor的方法 (1)背景要求: 对于某一列,比如密码,动态增加时候,是可以编辑 ...
 - log4j2用Log4jContextSelector启动参数配置全局异步日志是如何使用disruptor
			
与 log4j2用asyncRoot配置异步日志是如何使用disruptor差异有几个: 给disruptor实例的EventFactory不同 此处EventFactory采用的是RingBuffe ...
 - log4j2用asyncRoot配置异步日志是如何使用disruptor
			
用asyncRoot配置对应的对接disruptor类是AsyncLoggerConfigDisruptor,用Log4jContextSelector启动参数配置全局异步的对应的对接disrupto ...
 - Web前端知识体系V0.1
			
学习,是一个建立“索引”的过程-好比我们读一本书,读完之后,再次看这本书的目录结构,就会联想起很多书中的具体内容: 博客,是一个回顾所学的载体-学习完教学Video之后,通过书写博客,以达到记忆的目的 ...
 - tail /grep/more
			
1.tail -f 文件名 不断的刷新日志信息,实时的得到新追加到文件中的信息,常用来跟踪日志文件,如tail -f err.log Ctrl+C退出 2.grep '内容' 文件名 3.more 分 ...
 - BZOJ 1050: [HAOI2006]旅行comf(枚举+并查集)
			
[HAOI2006]旅行comf Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点 ...
 - 【bzoj2789】[Poi2012]Letters   树状数组求逆序对
			
题目描述 给出两个长度相同且由大写英文字母组成的字符串A.B,保证A和B中每种字母出现的次数相同. 现在每次可以交换A中相邻两个字符,求最少需要交换多少次可以使得A变成B. 输入 第一行一个正整数n ...