社区讨论
求莫队卡常
CF594DREQ参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @m1yh4kqk
- 此快照首次捕获于
- 2024/10/07 11:50 去年
- 此快照最后确认于
- 2025/11/04 17:44 4 个月前
CPP
#include<bits/stdc++.h>
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define Rrep(a,b,c) for(int a=b;a>=c;a--)
using namespace std;
typedef long long ll;
const int MAXN=2e5+5,mod=1e9+7,MAXA=1e6+5;
int n,q;
int blk;
struct quy{
int l,r,id;
bool operator<(const quy &t)const{
if(l/blk!=t.l/blk)return l<t.l;
if((l/blk)&1)return r<t.r;
return r>t.r;
}
}md[MAXN];
int ans[MAXN],now=1;
int a[MAXN];
int ksm(int x,int p){
int res=1;
while(p){
if(p&1)res=(1ll*res*x)%mod;
x=(1ll*x*x)%mod;
p>>=1;
}
return res;
}
int inv(int x){
return ksm(x,mod-2);
}
int cnt,prm[78498+5],vis[MAXA];
struct node{
int idx,num;
};
int inv1[78498+5],inv2[78498+1][21],pw[78498+1][21];
vector<node> fj[MAXA];
void sieve(){
rep(i,2,1e6){
if(vis[i])continue;
prm[++cnt]=i;
for(int j=i;j<=1e6;j+=i){
vis[j]=1;
fj[j].push_back((node){cnt,0});
}
}
}
int in[78498+5],ck[MAXA];
void add(int ii){
for(node t:fj[ii]){
if(in[t.idx]==0)now=(1ll*now*(prm[t.idx]-1)%mod)*pw[t.idx][t.num-1]%mod;
else now=(1ll*now*pw[t.idx][t.num])%mod;
in[t.idx]+=t.num;
}
}
void del(int ii){
for(node t:fj[ii]){
if(in[t.idx]==t.num)now=(1ll*now*inv2[t.idx][t.num-1]%mod)*inv1[t.idx]%mod;
else now=(1ll*now*inv2[t.idx][t.num])%mod;
in[t.idx]-=t.num;
}
}
int main(){
// clock_t st=clock();
// freopen("1.in","r",stdin);
// freopen("1.out","w",stdout);
ios::sync_with_stdio(0);
cin>>n;
blk=sqrt(n)+500;
rep(i,1,n)cin>>a[i];
sieve();
rep(i,1,n){
if(ck[a[i]])continue;
ck[a[i]]=1;
for(node &t:fj[a[i]]){
int x=a[i];
while(x%prm[t.idx]==0){
x/=prm[t.idx];
t.num++;
}
}
}
rep(i,1,cnt){
inv1[i]=inv(prm[i]-1);
ll j=prm[i];
int tt=inv(prm[i]),xx=1;
inv2[i][0]=1;
while(j<=1e6){
inv2[i][xx]=1ll*inv2[i][xx-1]*tt%mod;
j*=prm[i];
xx++;
}
j=prm[i];
pw[i][0]=1;
xx=1;
while(j<=1e6){
pw[i][xx]=1ll*pw[i][xx-1]*prm[i]%mod;
j*=prm[i];
xx++;
}
}
cin>>q;
rep(i,1,q)cin>>md[i].l>>md[i].r,md[i].id=i;
sort(md+1,md+q+1);
int L=1,R=0;
now=1;
rep(i,1,q){
int l=md[i].l,r=md[i].r;
while(L>l)L--,add(a[L]);
while(R<r)R++,add(a[R]);
while(L<l)del(a[L]),L++;
while(R>r)del(a[R]),R--;
ans[md[i].id]=now;
}
rep(i,1,q)cout<<ans[i]<<endl;
// clock_t ed=clock();
// cout<<"time: "<<ed-st<<endl;
return 0;
}
极限数据大概5.2s,无能为力了。
回复
共 1 条回复,欢迎继续交流。
正在加载回复...