[CODECHEF]SEGPROD
题意:给定$a_{1\cdots n}$和$p$,多次询问$\prod\limits_{i=l}^ra_i$对$p$取模的值,强制在线,每次询问要求$O(1)$回答
一个微小的黑科技...
静态区间查询,可以想到ST表,但ST表的区间会互相覆盖,不能满足这题的要求,也不能前缀和因为$p$可能不是质数
于是我们有一个类似ST表的技术
设$A_{k,i}=\prod\limits_{j=\left\lfloor\frac i{2^k}\right\rfloor2^k}^ia_j,B_{k,i}=\prod\limits_{j=i}^{\left\lceil\frac{i+1}{2^k}\right\rceil2^k-1}a_j$
$A_{k,i}$表示的是($\leq i$的最大的$2^k$的倍数)到$i$这一段数的乘积,$B_{k,i}$表示的是$i$到($\gt i$的最小的$2^k$的倍数$-1$)这一段数的乘积,这两个都可以$O(n\log_2n)$预处理
对于询问$[l,r]$,如果$l=r$那么答案就是$a_l$,下面讨论$l\lt r$的情况
如果我们可以找到一个$k$,使得$[l+1,r]$中只有一个$2^k$的倍数,那么$B_{k,l}A_{k,r}$就是答案
容易验证一个满足要求的$k$就是$\log_2\left(\text{highbit}(r\text{ xor }l)\right)$,然后这题就做完了...
#include<stdio.h> typedef long long ll; void swap(int&a,int&b){a^=b^=a^=b;} int p; int mul(int a,int b){return a*(ll)b%p;} int a[1000010],b[320010],hb[1048577],A[20][1000010],B[20][1000010]; int query(int l,int r){ if(l==r)return a[l]%p; int k=hb[l^r]; return mul(B[k][l],A[k][r]); } int up(int x,int k){ return(x&((1<<k)-1))==0?x>>k:(x>>k)+1; } void work(){ int n,q,i,j,l,r,x; scanf("%d%d%d",&n,&p,&q); for(i=0;i<n;i++)scanf("%d",a+i); for(i=0;i<n;i++)A[0][i]=B[0][i]=a[i]; for(j=1;1<<j<n;j++){ for(i=0;i<n;i++)A[j][i]=mul(a[i],i>>j<<j==i?1:A[j][i-1]); B[j][n]=1; for(i=n-1;i>=0;i--)B[j][i]=mul(a[i],(up(i+1,j)<<j)-1==i?1:B[j][i+1]); hb[1<<j]=j; } hb[1<<j]=j; j=1<<j; for(i=1;i<j;i++){ if(!hb[i])hb[i]=hb[i-1]; } for(i=0;i<q/64+2;i++)scanf("%d",b+i); x=0; for(i=0;i<q;i++){ if((i&63)==0){ l=(b[i>>6]+x)%n; r=(b[(i>>6)+1]+x)%n; }else{ l=(l+x)%n; r=(r+x)%n; } if(l>r)swap(l,r); x=(query(l,r)+1)%p; } printf("%d\n",x); } int main(){ int T; scanf("%d",&T); while(T--)work(); }
[CODECHEF]SEGPROD的更多相关文章
- 【BZOJ-3514】Codechef MARCH14 GERALD07加强版 LinkCutTree + 主席树
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1288 Solved: 490 ...
- 【BZOJ4260】 Codechef REBXOR 可持久化Trie
看到异或就去想前缀和(⊙o⊙) 这个就是正反做一遍最大异或和更新答案 最大异或就是很经典的可持久化Trie,从高到低贪心 WA: val&(1<<(base-1))得到的并不直接是 ...
- codechef 两题
前面做了这场比赛,感觉题目不错,放上来. A题目:对于数组A[],求A[U]&A[V]的最大值,因为数据弱,很多人直接排序再俩俩比较就过了. 其实这道题类似百度之星资格赛第三题XOR SUM, ...
- codechef January Challenge 2014 Sereja and Graph
题目链接:http://www.codechef.com/JAN14/problems/SEAGRP [题意] 给n个点,m条边的无向图,判断是否有一种删边方案使得每个点的度恰好为1. [分析] 从结 ...
- BZOJ3509: [CodeChef] COUNTARI
3509: [CodeChef] COUNTARI Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 339 Solved: 85[Submit][St ...
- CodeChef CBAL
题面: https://www.codechef.com/problems/CBAL 题解: 可以发现,我们关心的仅仅是每个字符出现次数的奇偶性,而且字符集大小仅有 26, 所以我们状态压缩,记 a[ ...
- CodeChef FNCS
题面:https://www.codechef.com/problems/FNCS 题解: 我们考虑对 n 个函数进行分块,设块的大小为S. 每个块内我们维护当前其所有函数值的和,以及数组中每个元素对 ...
- codechef Prime Distance On Tree(树分治+FFT)
题目链接:http://www.codechef.com/problems/PRIMEDST/ 题意:给出一棵树,边长度都是1.每次任意取出两个点(u,v),他们之间的长度为素数的概率为多大? 树分治 ...
- BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )
树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...
随机推荐
- 解决java在对MySQL插入数据时出现乱码问题
1.在连接数据库的时候请注意, 最使用连接连接数据库的时候,必须在后面追加上编码的设置:useUnicode=true&characterEncoding=UTF-8,如下图所示. 参考连接: ...
- No 'Access-Control-Allow-Origin' Ajax跨域访问解决方案
No 'Access-Control-Allow-Origin' header is present on the requested resource. 当使用ajax访问远程服务器时,请求失败,浏 ...
- javascript执行上下文学习一
原文: http://web.jobbole.com/84044/ http://blog.csdn.net/github_34514750/article/details/52901781 1.三种 ...
- cart回归树算法过程
回归树:使用平方误差最小准则 训练集为:D={(x1,y1), (x2,y2), …, (xn,yn)}. 输出Y为连续变量,将输入划分为M个区域,分别为R1,R2,…,RM,每个区域的输出值分别为: ...
- python基础===flask使用整理(转)
flask 使用的一些整理 资源 Flask 文档|英文| expore flask| 快速教材| flask-admin| Flask-DebugToolbar| Flask-Login| Flas ...
- [转载]循规蹈矩:快速读懂SQL执行计划的套路与工具
作者介绍 梁敬彬,福富研究院副理事长.公司唯一四星级内训师,国内一线知名数据库专家,在数据库优化和培训领域有着丰富的经验.多次应邀担任国内外数据库大会的演讲嘉宾,在业界有着广泛的影响力.著有多本畅销书 ...
- 【Java基础】重写equals需要重写hashcode
Object里的equals用来比较两个对象的相等性,一般情况下,当重写这个方法时,通常有必要也重写hashcode,以维护hashcode方法的常规协定,或者说这是JDK的规范,该协定声明相等对象必 ...
- 【python】r+,w+ 全局变量
来源:http://www.educity.cn/wenda/352188.html r+:可读可写,若文件不存在,报错w+: 可读可写,若文件不存在,创建文本模式:遇换行符时根据操作系统不同自动转换 ...
- oracle11g如何创建数据库
oracle11g创建数据库的步骤如下:1.按住键盘上Windows键,打开开始菜单,找到Database Configuration Assitant并打开:2.打开数据库配置助手Database ...
- Go语言用mock server模拟调用(httptest)
mock是个好东东, 在大项目或大公司,很实用, 因为很多环境不是随时在开发环境可得的. package main import ( "testing" "net/htt ...