WA&T求助
查看原帖
WA&T求助
200044
JS_TZ_ZHR楼主2020/8/14 19:33

T先不说,为什么会WA?

#pragma GCC optimize("Ofast","-funroll-loops","-fdelete-null-pointer-checks")
#pragma GCC target("ssse3","sse3","sse2","sse","avx2","avx")
#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define ll long long
#define lowbit(x) x&(-x)
using namespace std;
int n,m,phi[20000005]= {0,1},opt,x,y,z,mod[100005],cnt,a;
long long tree[500005];
struct check {
	ll val;
	bool flag;
};
inline void add(int sum,int k) {
	if(!k)return;
	while(k<=n) {
		tree[k]+=sum;
		k+=lowbit(k);
	}
}
inline int query(int k) {
	int res=0;
	while(k) {
		res+=tree[k];
		k-=lowbit(k);
	}
	return res;
}
inline check qpow(ll d,int p,int md) {
	check res;
	res.val=1,res.flag=0;
	if(d>=md)d%=md,res.val=1;
	while(p) {
		if(p&1) {
			res.val*=d;
			if(res.val>=md)res.flag=1,res.val%=md;
		}
		d*=d;
		if(d>=md)res.flag=1,d%=md;
		p>>=1;
	}
	return res;
}
inline check ask(int l,int r,int md) {
	check res;
	int t=query(l);
	if(md==1)return (check) {
		0,1
	};
	else if(t==1)return (check) {
		1,0
	};
	else if(l==r&&t>=md)return (check) {
		t%md,1
	};
	else if(l==r&&t<md)return (check) {
		t,0
	};
	else {
		res=ask(l+1,r,phi[md]);
		if(res.flag)res.val+=phi[md];
		return qpow(t,res.val,md);
	}
}
signed main() {
	scanf("%d%d",&n,&m);
	for(int i=1; i<=n; i++) {
		scanf("%d",&a);
		add(a,i);
		add(-a,i+1);
	}
	for(int i=2; i<=2e7; i++) {
		if(!phi[i]) {
			for(int j=i; j<=2e7; j+=i) {
				if(!phi[j])phi[j]=j;
				phi[j]=phi[j]/i*(i-1);
			}
		}
	}
	while(m--) {
		scanf("%d%d%d%d",&opt,&x,&y,&z);
		if(opt==1)
			add(-z,y+1),add(z,x);
		else printf("%d\n",ask(x,y,z).val%z);
	}
}
2020/8/14 19:33
加载中...