题意:给定$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. MSSQL 视图/事务(TRAN[SACTION])/存储过程(PROC[EDURE])/触发器(TRIGGER )

    --视图 视图是一张虚拟表,它表示一张表的部分数据或多张表的综合数据,其结构和数据是建立在对表的查询基础上 视图在操作上和数据表没有什么区别,但两者的差异是其本质是不同: 数据表是实际存储记录的地方, ...

  2. 在ubuntu16.04+python3.5情况下安装nltk,以及gensim时pip3安装不成功的解决办法

    在ubuntu16.04+python3.5情况下安装nltk,以及gensim时pip3安装不成功的解决办法,我刚开始因为不太会用linux命令,所以一直依赖于python 的pip命令,可是怎么都 ...

  3. python模块(requests,logging)

    一.requests Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythone ...

  4. linux percpu机制解析【转】

    转自:http://blog.csdn.net/wh8_2011/article/details/53138377 一.概述 每cpu变量是最简单也是最重要的同步技术.每cpu变量主要是数据结构数组, ...

  5. ThinkPHP5 模型 - 事务支持

    使用事务之前,先确保数据库的存储引擎支持事务操作. MyISAM:不支持事务,主要用于读数据提高性能 InnoDB:支持事务.行级锁和并发 Berkeley DB:支持事务 ThinkPHP5 使用事 ...

  6. MACACA===gradle下载和安装

    gradle下载地址: http://services.gradle.org/distributions/ 或者直接点击这个: http://services.gradle.org/distribut ...

  7. 网络知识===wireshark抓包,三次握手分析

    TCP需要三次握手建立连接: 网上的三次握手讲解的太复杂抽象,尝试着使用wireshark抓包分析,得到如下数据: 整个过程分析如下: step1 client给server发送:[SYN] Seq ...

  8. idea+spring+springmvc+mybatis+mybatis+maven

    使用SSM(Spring,SpringMVC和Mybatis) 1.1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johns ...

  9. Google Guice 之绑定1

    绑定和依赖注入区别 绑定,使用时 需要通过 injector 显示获取 依赖注入,只需要显示获取主类,他的依赖是通过@Injector 和 绑定关系 隐式注入的 http://blog.csdn.ne ...

  10. Django Rest Framework用户访问频率限制

    一. REST framework的请求生命周期 基于rest-framework的请求处理,与常规的url配置不同,通常一个django的url请求对应一个视图函数,在使用rest-framewor ...