【2019集训队互测】序列

传送门


题解:

小清新送分题。

设序列长度为 2 k 2^k 2k,按照那个预处理完了之后,所有序列一定是有一半完全一样,另一半递归满足这个性质。

所以描述一个序列只需要 log ⁡ m \log m logm 的复杂度。

发现在xor卷积下,两个满足该性质的序列卷积结果依然满足,所以用这个方式维护下去即可。


代码:

#include<bits/stdc++.h>
#define ll long long
#define re register
#define cs const

namespace IO{

inline char gc(){
	static cs int Rlen=1<<22|1;static char buf[Rlen],*p1,*p2;
	return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,Rlen,stdin),p1==p2)?EOF:*p1++;
}template<typename T>T get_integer(){
	char c;bool f=false;while(!isdigit(c=gc()))f=c=='-';T x=c^48;
	while(isdigit(c=gc()))x=((x+(x<<2))<<1)+(c^48);return f?-x:x;
}inline int gi(){return get_integer<int>();}

}using namespace IO;

using std::cerr;
using std::cout;
#define ctz(x) __builtin_ctz(x)
#define clz(x) __builtin_clz(x)

cs int mod=998244353;
inline int add(int a,int b){return a+b>=mod?a+b-mod:a+b;}
inline int dec(int a,int b){return a-b<0?a-b+mod:a-b;} 
inline int mul(int a,int b){ll r=(ll)a*b;return r>=mod?r%mod:r;}
inline void Inc(int &a,int b){a+=b-mod;a+=a>>31&mod;}
inline void Dec(int &a,int b){a-=b;a+=a>>31&mod;}
inline void Mul(int &a,int b){a=mul(a,b);}

cs int bit=19,N=7e5+7;
int n,m,Q,up;
struct atom{
	int vl[bit+1],otr,msk;
	int query(int p)cs{
		p^=msk;if(p==0)return otr;
		return vl[31-clz(p)];
	}
};

atom a[N];

void merge(atom &a,cs atom &b){
	int sa=a.otr,sb=b.otr;
	for(int re i=0;i<up;++i){
		Inc(sa,mul(1<<i,a.vl[i]));
		Inc(sb,mul(1<<i,b.vl[i]));
	}int sm=0;a.msk^=b.msk;
	for(int re i=up-1;~i;--i){
		Dec(sa,mul(1<<i,a.vl[i]));
		Dec(sb,mul(1<<i,b.vl[i]));
		int tmp=mul(a.vl[i],b.vl[i]);
		a.vl[i]=add(sm,add(mul(a.vl[i],sb),mul(b.vl[i],sa)));
		Inc(sm,mul(tmp,1<<i)); 
	}a.otr=add(sm,mul(a.otr,b.otr));
}

void Main(){
	n=gi(),m=gi(),Q=gi();
	while((1<<up)<=m)++up;
	for(int re i=1;i<=n;++i){
		int x=gi(),v=gi();a[i].msk=x;
		while(x){
			a[i].vl[ctz(x)]=mul(x,x^v),
			x&=x-1;
		}
	}for(int re i=2;i<=n;++i)
		merge(a[i],a[i-1]);
	while(Q--){
		int x=gi(),p=gi();
		cout<<a[x].query(p)<<"\n";
	}
}

inline void file(){
#ifdef zxyoi
	freopen("sequence.in","r",stdin);
#endif 
}signed main(){file();Main();return 0;} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值