General
 
 
# Author Problem Lang Verdict Time Memory Sent Judged  
126533241 Practice:
chen_qian
1109E - 60 C++14 (GCC 6-32) Accepted 764 ms 38488 KB 2021-08-20 14:56:32 2021-08-20 14:56:32
→ Source
#include<bits/stdc++.h>
#define N 100005
#define ll long long 
using namespace std;
int n,m,mod;
int p[15],cnt;
struct node{
	int a[15];
	ll x;
	node(){
		memset(a,0,sizeof(a));
		x=1;
	}
	void clear(){
		for(int i=1;i<=cnt;i++) a[i]=0;
		x=1;
	}
}tag[N<<2];
ll ksm(ll x,int b){
	ll res=1;
	while(b){
		if(b&1) res=(res*x)%mod;
		x=(x*x)%mod;
		b>>=1;
	}
	return res;
}
void exgcd(int a,int b,int &x,int &y){
	if(!b){
		x=1,y=0;
		return ;
	}
	exgcd(b,a%b,x,y);
	int z=x;
	x=y;
	y=z-(a/b)*y;
}
int inv(int a,int b){
	int x,y;
	exgcd(a,b,x,y);
	return ((ll)x+b)%b;
}
node operator *(const node &a,const node &b){
	node res;
	for(int i=1;i<=cnt;i++) res.a[i]=a.a[i]+b.a[i];
	res.x=(a.x*b.x)%mod;
	return res;
}
node operator /(const node &a,const node &b){
	node res;
	for(int i=1;i<=cnt;i++) res.a[i]=(a.a[i]-b.a[i]);
	res.x=(a.x*inv(b.x,mod))%mod;
	return res;
}
ll calc(node x){
	ll res=x.x;
	for(int i=1;i<=cnt;i++) res=(res*ksm(p[i],x.a[i])%mod);
	return res;
}
node divide(int x){
	node res;
	for(int i=1;i<=cnt;i++)
		while(x%p[i]==0) x/=p[i],res.a[i]++;
	res.x=x;
	return res;
}
int a[N];
ll sum[N<<2],mul[N<<2];
void push_up(int u){
	sum[u]=(sum[u<<1]+sum[u<<1|1])%mod;
}
void push_tag(int u,int x,node v){
	tag[u]=tag[u]*v;
	mul[u]=(mul[u]*x)%mod;
	sum[u]=(sum[u]*x)%mod;
}
void push_down(int u){
	if(mul[u]!=1){
		push_tag(u<<1,mul[u],tag[u]);
		push_tag(u<<1|1,mul[u],tag[u]);
		tag[u].clear();
		mul[u]=1;
	}
}
void modify(int p,int l,int r,int ql,int qr,int x,node v){
	if(ql<=l&&qr>=r){
		push_tag(p,x,v);
		return ;
	}
	push_down(p);
	int mid=(l+r)>>1;
	if(ql<=mid) modify(p<<1,l,mid,ql,qr,x,v);
	if(qr>mid) modify(p<<1|1,mid+1,r,ql,qr,x,v);
	push_up(p);
}
void Modify(int p,int l,int r,int x,node v){
	if(l==r){
		tag[p]=tag[p]/v;
 		sum[p]=calc(tag[p]);
		return ;
	}
	push_down(p);
	int mid=(l+r)>>1;	
	if(x<=mid) Modify(p<<1,l,mid,x,v);
	else Modify(p<<1|1,mid+1,r,x,v);
	push_up(p);	
}
ll query(int p,int l,int r,int ql,int qr){
	if(ql<=l&&qr>=r) return sum[p];
	ll res=0;
	int mid=(l+r)>>1;
	push_down(p);
	if(ql<=mid) res=(res+query(p<<1,l,mid,ql,qr))%mod;
	if(qr>mid) res=(res+query(p<<1|1,mid+1,r,ql,qr))%mod;
	return res;
}
void build(int p,int l,int r){
	mul[p]=1;
	if(l==r){
		sum[p]=a[l]%mod;
		tag[p]=divide(a[l]);
		return ;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	push_up(p);
}
int main(){
	scanf("%d%d",&n,&mod);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	int x=mod;
	for(int i=2;(ll)i*i<=mod;i++){
		if(x%i) continue;
		p[++cnt]=i;
		while(x%i==0) x/=i;
	}
	if(x>1) p[++cnt]=x;
	build(1,1,n);
	scanf("%d",&m);
	while(m--){
		int op,l,r,x;
		scanf("%d",&op);
		if(op==1){
			scanf("%d%d%d",&l,&r,&x);
			modify(1,1,n,l,r,x,divide(x));
		}
		if(op==2){
			scanf("%d%d",&l,&x);
			Modify(1,1,n,l,divide(x));
		}
		if(op==3){
			scanf("%d%d",&l,&r);
			printf("%lld\n",query(1,1,n,l,r));
		}
	}
	return 0;
}
?
Time: ? ms, memory: ? KB
Verdict: ?
Input
?
Participant's output
?
Jury's answer
?
Checker comment
?
Diagnostics
?
Click to see test details