社区讨论

主席树RE on test 59求助

CF594DREQ参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo13q3ty
此快照首次捕获于
2023/10/22 14:42
2 年前
此快照最后确认于
2023/11/02 14:13
2 年前
查看原帖
这题能拿主席树做吗?卡了一晚上了,空间一直卡不过去。开大 MLE,开小 RE。
CPP
#include<bits/stdc++.h>
#define inv(x) qpow(x,P-2)
using ll=long long;
constexpr int P=1e9+7;
inline ll qpow(ll a,ll b){ll ans(1);for(;b;b>>=1,a=a*a%P)if(b&1)ans=ans*a%P;return ans;}
int n,qnum,a[200001],root[200001],m[200001],lst[1000001],f[1000001],isp[80000],cnt;
inline void linear_sieve(){
	for(int i=2;i<=1000000;++i){
		if(!f[i])isp[++cnt]=i,f[i]=i;
		for(int j=1;j<=cnt&&1ll*i*isp[j]<=1000000;++j){
			f[i*isp[j]]=isp[j];
			if(i%isp[j]==0)break;
		}
	}
}
struct HjtTree{
	struct node{int ls,rs,mul=1;}T[21410000];int tot=0;
	inline void pushup(int o){T[o].mul=1ll*T[T[o].ls].mul*T[T[o].rs].mul%P;}
	void modify(int &o,int pre,int l,int r,int x,int v){
		o=++tot;T[o]=T[pre];if(l==r)return T[o].mul=1ll*T[o].mul*v%P,void();int mid=l+r>>1;
		(x<=mid)?modify(T[o].ls,T[pre].ls,l,mid,x,v):modify(T[o].rs,T[pre].rs,mid+1,r,x,v);
		pushup(o);
	}
	int query(int o,int l,int r,int ql,int qr){
		if(ql<=l&&r<=qr)return T[o].mul;
		int mid=l+r>>1,ans=1;
		if(ql<=mid)ans=1ll*ans*query(T[o].ls,l,mid,ql,qr)%P;
		if(qr>mid)ans=1ll*ans*query(T[o].rs,mid+1,r,ql,qr)%P;
		return ans;
	}
}t;
inline void Divide(int id){
	int now=a[id];root[id]=root[id-1];
	for(int i=f[now];now>1;i=f[now]){
		t.modify(root[id],root[id],1,n,id,inv(i)*(i-1)%P);
		if(lst[i])t.modify(root[id],root[id],1,n,lst[i],inv(i-1)*i%P);
		lst[i]=id;
		while(now%i==0)now/=i;
	}
}
int main(){
	std::cin.tie(nullptr)->sync_with_stdio(false);
	linear_sieve();std::cin>>n;m[0]=1; 
	for(int i=1;i<=n;++i)std::cin>>a[i],Divide(i),m[i]=1ll*m[i-1]*a[i]%P;
	std::cin>>qnum;
	for(int l,r,ans;qnum;--qnum){
		std::cin>>l>>r;
		ans=1ll*m[r]*inv(m[l-1])%P*t.query(root[r],1,n,l,r)%P;
		std::cout<<ans<<'\n';
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...