General
 
 
# Author Problem Lang Verdict Time Memory Sent Judged  
133940517 Practice:
Miko35
1109E - 60 C++14 (GCC 6-32) Accepted 701 ms 190488 KB 2021-11-01 15:28:42 2021-11-01 15:28:43
→ Source
#include<bits/stdc++.h>
#define rgi register int
#define cl(x) memset(x,0,sizeof x)
#define FOR(i,a,b) for(rgi i=a,i##i=b;i<=i##i;++i)
#define ROF(i,a,b) for(rgi i=a,i##i=b;i>=i##i;--i)
typedef long long ll;
using namespace std;
const int N=400010,L=11;
int n,mod,q,P[L],C,v,a[N],h[L],t[L],Ph;
ll qpow(ll a,ll b){
	ll R=1;
	for(a%=mod;b;b>>=1,a=a*a%mod)if(b&1)R=R*a%mod;
	return R;
}
#define mid (l+r>>1)
#define lc k<<1
#define rc lc|1
ll s[N<<2],g[N<<2],mu[N<<2],mg[N<<2],c[N<<2][L];
void chg(int k,ll v,ll z){(g[k]*=z)%=mod,(mg[k]*=z)%=mod,(s[k]*=v)%=mod,(mu[k]*=v)%=mod;}
void pdown(int k){chg(lc,mu[k],mg[k]),chg(rc,mu[k],mg[k]),mu[k]=mg[k]=1;}
void pup(int k){s[k]=(s[lc]+s[rc])%mod,g[k]=(g[lc]+g[rc])%mod;}
void build(int k,int l,int r){
	mu[k]=mg[k]=1;
	if(l==r){
		s[k]=a[l]%mod;
		FOR(i,1,C)while(a[l]%P[i]==0)a[l]/=P[i],++c[k][i];
		return void(g[k]=a[l]%mod);
	}
	build(lc,l,mid),build(rc,mid+1,r),pup(k);
}
ll qry(int x,int y,int k=1,int l=1,int r=n){
	if(l>y||r<x)return 0;
	pdown(k);
	return l<x||r>y?(qry(x,y,lc,l,mid)+qry(x,y,rc,mid+1,r))%mod:s[k];
}
void mul(int x,int y,int z,int k=1,int l=1,int r=n){
	if(l>y||r<x)return;
	if(l>=x&&r<=y){
		FOR(i,1,C)c[k][i]+=h[i];
		return chg(k,v,z);
	}
	pdown(k),mul(x,y,z,lc,l,mid),mul(x,y,z,rc,mid+1,r),pup(k);
}
void upd(int x,int k=1,int l=1,int r=n){
	if(l>x||r<x)return;
	FOR(i,1,C)t[i]+=c[k][i];
	if(l==r){
		s[k]=g[k]=g[k]*qpow(v,Ph-1)%mod;
		FOR(i,1,C)c[k][i]-=h[i],s[k]=s[k]*qpow(P[i],t[i]-h[i])%mod;
		return;
	}
	pdown(k),upd(x,lc,l,mid),upd(x,rc,mid+1,r),pup(k);
}
int work(int x){
	cl(h);
	FOR(i,1,C)while(x%P[i]==0)++h[i],x/=P[i];
	return x;
}
void out(){
	cerr<<"======  ";
	FOR(i,1,n)cerr<<qry(i,i)<<' ';
	cerr<<endl;
}
signed main(){
	scanf("%d%d",&n,&mod),v=Ph=mod;
	FOR(i,2,4e4){
		if(v%i==0)P[++C]=i,Ph=Ph*(i-1ll)/i;
		while(v%i==0)v/=i;
	}
	if(v>1)P[++C]=v,Ph=Ph*(v-1ll)/v;
	FOR(i,1,n)scanf("%d",a+i);
	build(1,1,n);
	for(scanf("%d",&q);q--;){
		int o,l,r;
		scanf("%d%d%d",&o,&l,&r);
		if(o==1)scanf("%d",&v),mul(l,r,work(v));
		if(o==2)cl(t),v=work(r),upd(l);
		if(o==3)printf("%lld\n",qry(l,r));
	}
	return 0;
}
?
Time: ? ms, memory: ? KB
Verdict: ?
Input
?
Participant's output
?
Jury's answer
?
Checker comment
?
Diagnostics
?
Click to see test details