60pts 求卡常
查看原帖
60pts 求卡常
652972
DegChuZm楼主2024/3/22 21:31
#include<bits/stdc++.h>
using namespace std;
long long n,k,ans,j,m;
const int mod=998244353;
char buf[1<<20], *p1, *p2;
char gc() { return p1 == p2 ? p2 = buf + fread(p1 = buf, 1, 1<<20, stdin), (p1 == p2) ? EOF : *p1++ : *p1++; }
inline int read(int f = 1, char c = gc(), int x = 0) {
	while(c < '0' || c > '9') f = (c == '-') ? -1 : 1, c = gc();
	while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = gc();
	return f * x;
}
struct dcz{
	long long mp[4][4];
}tr[1000001],add[1000001],a[250001];
void write(int x){
	if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+'0');
    return ;
}
long long Mod(int x){
	return x>mod?x-mod:x;
}
dcz z;
inline dcz mul(dcz x,dcz y){
	memset(z.mp,0,sizeof(z.mp));
	for(register int i=0;i<4;++i){
		for(register int k=0;k<4;++k){
			for(register int j=0;j<4;++j){
				z.mp[i][j]=Mod(z.mp[i][j]+(x.mp[i][k]*y.mp[k][j])%mod);
			}
		}
	}
	return z;
}
inline void get(dcz &x){
	x.mp[0][0]=x.mp[1][1]=x.mp[2][2]=x.mp[3][3]=1;
	x.mp[0][1]=x.mp[0][2]=x.mp[0][3]=x.mp[1][0]=x.mp[1][2]=x.mp[1][3]=x.mp[2][1]=x.mp[2][3]=x.mp[2][0]=x.mp[3][0]=x.mp[3][1]=x.mp[3][2]=0;
}
inline dcz a_d_d(dcz x,dcz y){
	memset(z.mp,0,sizeof(z.mp));
	for(register int i=0;i<4;++i){
		z.mp[0][i]=Mod(x.mp[0][i]+y.mp[0][i]);
	}
	return z;
}
void build(int l,int r,int root){
	get(add[root]);
	if(l==r){
		tr[root]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,root<<1);
	build(mid+1,r,root<<1|1);
	tr[root]=a_d_d(tr[root<<1],tr[root<<1|1]);
}
inline bool check(dcz sb){
	for(register int i=0;i<4;++i){
		for(register int j=0;j<4;++j){
			if(i==j&&sb.mp[i][j]!=1)
				return 1;
			if(i!=j&&sb.mp[i][j]!=0)
				return 1;
		}
	}
	return 0;
}
inline void pd(int x){
	if(check(add[x])){
		add[x<<1]=mul(add[x<<1],add[x]);
		add[x<<1|1]=mul(add[x<<1|1],add[x]);
		tr[x<<1]=mul(tr[x<<1],add[x]);
		tr[x<<1|1]=mul(tr[x<<1|1],add[x]);
		get(add[x]);
	}
}
void update(int L,int R,int sum,int l,int r,int root,int cz){
	if(L<=l&&r<=R){
		dcz sb;
		get(sb);
		if(cz==1){
			sb.mp[1][0]=1;
			tr[root]=mul(tr[root],sb);
			add[root]=mul(add[root],sb);
		}
		else if(cz==2){
			sb.mp[2][1]=1;
			tr[root]=mul(tr[root],sb);
			add[root]=mul(add[root],sb);
		}
		else if(cz==3){
			sb.mp[0][2]=1;
			tr[root]=mul(tr[root],sb);
			add[root]=mul(add[root],sb);
		}
		else if(cz==4){
			sb.mp[3][0]=sum;
			tr[root]=mul(tr[root],sb);
			add[root]=mul(add[root],sb);
		}
		else if(cz==5){
			sb.mp[1][1]=sum;
			tr[root]=mul(tr[root],sb);
			add[root]=mul(add[root],sb);
		}
		else{
			sb.mp[2][2]=0;
			sb.mp[3][2]=sum;
			tr[root]=mul(tr[root],sb);
			add[root]=mul(add[root],sb);
		}
		return ;
	}
	pd(root);
	int mid=(l+r)>>1;
	if(L<=mid)
	update(L,R,sum,l,mid,root<<1,cz);
	if(R>mid)
	update(L,R,sum,mid+1,r,root<<1|1,cz);
	tr[root]=a_d_d(tr[root<<1],tr[root<<1|1]);
}
dcz faq(int L,int R,int l,int r,int root){
	if(L<=l&&r<=R){
		return tr[root];
	}
	pd(root);
	int mid=(l+r)>>1;
	dcz val;
	memset(val.mp,0,sizeof(val.mp));
	if(L<=mid)
		val=a_d_d(val,faq(L,R,l,mid,root<<1));
	if(R>mid)
		val=a_d_d(val,faq(L,R,mid+1,r,root<<1|1));
	return val;
}
signed main(){
	ios::sync_with_stdio(0);
	cout.tie(0);
	n=read();
	long long o,x,y,z;
	for(register int i=1;i<=n;++i){
		x=read(),y=read(),z=read();
		a[i].mp[0][0]=x;
		a[i].mp[0][1]=y;
		a[i].mp[0][2]=z;
		a[i].mp[0][3]=1;
	}
	build(1,n,1);
	m=read();
	dcz fq;
	for(register int i=1;i<=m;++i){
		o=read(),x=read(),y=read();
		if(o==7){
			fq=faq(x,y,1,n,1);
			write(fq.mp[0][0]);
			putchar(' ');
			write(fq.mp[0][1]);
			putchar(' ');
			write(fq.mp[0][2]);
			puts("");
		}
		else{
			if(o>=4) z=read();
			update(x,y,z,1,n,1,o);
		}
	}
	return 0;
}
2024/3/22 21:31
加载中...