社区讨论
主席树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 条回复,欢迎继续交流。
正在加载回复...