题意:给定$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的更多相关文章

  1. 【BZOJ-3514】Codechef MARCH14 GERALD07加强版 LinkCutTree + 主席树

    3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 1288  Solved: 490 ...

  2. 【BZOJ4260】 Codechef REBXOR 可持久化Trie

    看到异或就去想前缀和(⊙o⊙) 这个就是正反做一遍最大异或和更新答案 最大异或就是很经典的可持久化Trie,从高到低贪心 WA: val&(1<<(base-1))得到的并不直接是 ...

  3. codechef 两题

    前面做了这场比赛,感觉题目不错,放上来. A题目:对于数组A[],求A[U]&A[V]的最大值,因为数据弱,很多人直接排序再俩俩比较就过了. 其实这道题类似百度之星资格赛第三题XOR SUM, ...

  4. codechef January Challenge 2014 Sereja and Graph

    题目链接:http://www.codechef.com/JAN14/problems/SEAGRP [题意] 给n个点,m条边的无向图,判断是否有一种删边方案使得每个点的度恰好为1. [分析] 从结 ...

  5. BZOJ3509: [CodeChef] COUNTARI

    3509: [CodeChef] COUNTARI Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 339  Solved: 85[Submit][St ...

  6. CodeChef CBAL

    题面: https://www.codechef.com/problems/CBAL 题解: 可以发现,我们关心的仅仅是每个字符出现次数的奇偶性,而且字符集大小仅有 26, 所以我们状态压缩,记 a[ ...

  7. CodeChef FNCS

    题面:https://www.codechef.com/problems/FNCS 题解: 我们考虑对 n 个函数进行分块,设块的大小为S. 每个块内我们维护当前其所有函数值的和,以及数组中每个元素对 ...

  8. codechef Prime Distance On Tree(树分治+FFT)

    题目链接:http://www.codechef.com/problems/PRIMEDST/ 题意:给出一棵树,边长度都是1.每次任意取出两个点(u,v),他们之间的长度为素数的概率为多大? 树分治 ...

  9. BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )

    树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...

随机推荐

  1. 解决java在对MySQL插入数据时出现乱码问题

    1.在连接数据库的时候请注意, 最使用连接连接数据库的时候,必须在后面追加上编码的设置:useUnicode=true&characterEncoding=UTF-8,如下图所示. 参考连接: ...

  2. No 'Access-Control-Allow-Origin' Ajax跨域访问解决方案

    No 'Access-Control-Allow-Origin' header is present on the requested resource. 当使用ajax访问远程服务器时,请求失败,浏 ...

  3. javascript执行上下文学习一

    原文: http://web.jobbole.com/84044/ http://blog.csdn.net/github_34514750/article/details/52901781 1.三种 ...

  4. cart回归树算法过程

    回归树:使用平方误差最小准则 训练集为:D={(x1,y1), (x2,y2), …, (xn,yn)}. 输出Y为连续变量,将输入划分为M个区域,分别为R1,R2,…,RM,每个区域的输出值分别为: ...

  5. python基础===flask使用整理(转)

    flask 使用的一些整理 资源 Flask 文档|英文| expore flask| 快速教材| flask-admin| Flask-DebugToolbar| Flask-Login| Flas ...

  6. [转载]循规蹈矩:快速读懂SQL执行计划的套路与工具

    作者介绍 梁敬彬,福富研究院副理事长.公司唯一四星级内训师,国内一线知名数据库专家,在数据库优化和培训领域有着丰富的经验.多次应邀担任国内外数据库大会的演讲嘉宾,在业界有着广泛的影响力.著有多本畅销书 ...

  7. 【Java基础】重写equals需要重写hashcode

    Object里的equals用来比较两个对象的相等性,一般情况下,当重写这个方法时,通常有必要也重写hashcode,以维护hashcode方法的常规协定,或者说这是JDK的规范,该协定声明相等对象必 ...

  8. 【python】r+,w+ 全局变量

    来源:http://www.educity.cn/wenda/352188.html r+:可读可写,若文件不存在,报错w+: 可读可写,若文件不存在,创建文本模式:遇换行符时根据操作系统不同自动转换 ...

  9. oracle11g如何创建数据库

    oracle11g创建数据库的步骤如下:1.按住键盘上Windows键,打开开始菜单,找到Database Configuration Assitant并打开:2.打开数据库配置助手Database ...

  10. Go语言用mock server模拟调用(httptest)

    mock是个好东东, 在大项目或大公司,很实用, 因为很多环境不是随时在开发环境可得的. package main import ( "testing" "net/htt ...