p7334分块20pts求助
  • 板块学术版
  • 楼主isme1
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/17 15:35
  • 上次更新2024/8/17 18:15:15
查看原帖
p7334分块20pts求助
912779
isme1楼主2024/8/17 15:35
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,a[200005],block,t,pos[200005],st[2005],ed[2005],mx[2005],add[2005],mod=998244353,k,single[200005];
void build(){
	block=(int)sqrt(n);
	t=n/block;
	if(n%block){
		t++;
	}
	for(int i=1;i<=t;i++){
		st[i]=(i-1)*block+1;
		ed[i]=i*block;
	}
	ed[t]=n;
	for(int i=1;i<=n;i++){
		pos[i]=(i-1)/block+1;
	}
}
void update1(int l,int r){//开方
	int x=pos[l];
	int y=pos[r];
	if(x==y){
		if(add[x]>=1){
			add[x]--;
			return;
		}
		for(int i=l;i<=r;i++){
			if(single[i]>=1){
				single[i]--;
				continue;
			}
			a[i]=(int)sqrt(a[i]);
		}
		return;
	}
	else{
		for(int i=l;i<=ed[x];i++){
			if(single[i]>=1){
				single[i]--;
				continue;
			}
			a[i]=(int)sqrt(a[i]);
		}
		for(int i=st[y];i<=r;i++){
			if(single[i]>=1){
				single[i]--;
				continue;
			}
			a[i]=(int)sqrt(a[i]);
		}
		for(int i=x+1;i<=y-1;i++){
			if(add[i]>=1){
				add[i]--;
				continue;
			}
			for(int j=st[i];j<=ed[i];j++){
				if(single[j]>=1){
					single[j]--;
					continue;
				}
				a[j]=(int)sqrt(a[j]);
			}
		}
		return;
	}
}
void update2(int l,int r){//平方
	int x=pos[l];
	int y=pos[r];
	if(x==y){
		for(int i=l;i<=r;i++){
			single[i]++;
		}
		return;
	}
	else{
		for(int i=l;i<=ed[x];i++){
			single[i]++;
		}
		for(int i=st[y];i<=r;i++){
			single[i]++;
		}
		for(int i=x+1;i<=y-1;i++){
			add[i]++;
		}
		return;
	}
}
int qpow(int x,int y){
	int ans=1,p=x;
	while(y>0){
		if(y&1){
			ans=ans%mod*p%mod;
			ans%=mod;
		}
		y>>=1;
		p*=p%mod;
		p%=mod;
	}
	return ans;
}
int phi(int x,int y){
	int ans=1;
	int p=x;
	while(y>0){
		if(y&1){
			ans=ans%k*p%k;
			ans%=k;
		}
		p=p%k*p%k;
		p%=k;
		y>>=1;
	}
	return ans%k+k;
}
signed main()
{
	k=mod-1;
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;++i){
		scanf("%lld",&a[i]);
	}
	build();
	for(int i=1;i<=m;++i){
		int op,l,r;
		scanf("%lld%lld%lld",&op,&l,&r);
		if(op==1){
			update1(l,r);
		}
		else{
			update2(l,r);
		}
	}
	int sum=0;
	for(int i=1;i<=n;++i){
		if(add[pos[i]]+single[i]<=29){
			int g=qpow(2,add[pos[i]]+single[i]);
			sum=sum+qpow(a[i],g)%mod;
			sum%=mod;
		}
		else{
		int x=phi(2,add[pos[i]]+single[i]);
		sum=sum+qpow(a[i],x)%mod;
		sum%=mod;
		}
	}
	cout<<sum;
	return 0;
}
2024/8/17 15:35
加载中...