General
 
 
# Author Problem Lang Verdict Time Memory Sent Judged  
50043015 Practice:
zsyzsy
1109E - 60 C++14 (GCC 6-32) Accepted 1372 ms 101748 KB 2019-02-17 06:40:43 2019-02-17 06:40:43
→ Source
#include<cstdio>
#include<algorithm>
using namespace std;
int gi(){
	int x=0,w=1;char ch=getchar();
	while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
	if(ch=='-')w=0,ch=getchar();
	while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
	return w?x:-x;
}
const int N=1e5+5;
const int M=2e6+5;
int n,mod,pri[9],tot,pw[9][M],q;
void exgcd(int a,int b,int &x,int &y){
	if(!b){x=1,y=0;return;}
	exgcd(b,a%b,y,x),y-=a/b*x;
}
int getinv(int a){
	int x,y;exgcd(a,mod,x,y);return (x%mod+mod)%mod;
}
struct data{
	int sum,s[9];
	data(){
		sum=0;
		for(int i=0;i<tot;++i)s[i]=0;
	}
	data(int x){
		if(!x){
			for(int i=0;i<tot;++i)s[i]=M-1;
			sum=0;
		}else{
			for(int i=0;i<tot;++i){
				s[i]=0;
				while(x%pri[i]==0)++s[i],x/=pri[i];
			}
			sum=x;
		}
	}
	data inv(){
		data c;c.sum=getinv(sum);
		for(int i=0;i<tot;++i)c.s[i]=-s[i];
		return c;
	}
	int val(){
		int res=sum;
		for(int i=0;i<tot;++i)res=1ll*res*pw[i][s[i]]%mod;
		return res;
	}
}t[N<<2],tag[N<<2];
data operator + (data a,data b){
	data c;int s1=a.sum,s2=b.sum;
	for(int i=0;i<tot;++i){
		c.s[i]=min(a.s[i],b.s[i]);
		s1=1ll*s1*pw[i][a.s[i]-c.s[i]]%mod;
		s2=1ll*s2*pw[i][b.s[i]-c.s[i]]%mod;
	}
	c.sum=(s1+s2)%mod;return c;
}
data operator * (data a,data b){
	data c;c.sum=1ll*a.sum*b.sum%mod;
	for(int i=0;i<tot;++i)c.s[i]=a.s[i]+b.s[i];
	return c;
}
void build(int x,int l,int r){
	tag[x]=data(1);
	if(l==r){t[x]=data(gi());return;}
	int mid=l+r>>1;build(x<<1,l,mid);build(x<<1|1,mid+1,r);
	t[x]=t[x<<1]+t[x<<1|1];
}
void cover(int x,data v){
	t[x]=t[x]*v;tag[x]=tag[x]*v;
}
void down(int x){
	cover(x<<1,tag[x]);cover(x<<1|1,tag[x]);tag[x]=data(1);
}
void modify(int x,int l,int r,int ql,int qr,data v){
	if(l>=ql&&r<=qr){cover(x,v);return;}
	down(x);int mid=l+r>>1;
	if(ql<=mid)modify(x<<1,l,mid,ql,qr,v);
	if(qr>mid)modify(x<<1|1,mid+1,r,ql,qr,v);
	t[x]=t[x<<1]+t[x<<1|1];
}
data query(int x,int l,int r,int ql,int qr){
	if(l>=ql&&r<=qr)return t[x];
	down(x);int mid=l+r>>1;data res=data(0);
	if(ql<=mid)res=res+query(x<<1,l,mid,ql,qr);
	if(qr>mid)res=res+query(x<<1|1,mid+1,r,ql,qr);
	return res;
}
int main(){
	n=gi();mod=gi();int x=mod;
	for(int i=2;i*i<=x;++i)
		if(x%i==0){
			pri[tot++]=i;
			while(x%i==0)x/=i;
		}
	if(x>1)pri[tot++]=x;
	for(int i=0;i<tot;++i)
		for(int j=pw[i][0]=1;j<M;++j)
			pw[i][j]=1ll*pw[i][j-1]*pri[i]%mod;
	build(1,1,n);q=gi();while(q--){
		int op=gi(),x=gi(),y=gi();
		if(op==1)modify(1,1,n,x,y,data(gi()));
		if(op==2)modify(1,1,n,x,x,data(y).inv());
		if(op==3)printf("%d\n",query(1,1,n,x,y).val());
	}
	return 0;
}
?
Time: ? ms, memory: ? KB
Verdict: ?
Input
?
Participant's output
?
Jury's answer
?
Checker comment
?
Diagnostics
?
Click to see test details