萌新初学莫队,悬赏 3 个关注
  • 板块CF594D REQ
  • 楼主w2y51c318
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/9/22 20:42
  • 上次更新2023/11/2 18:42:08
查看原帖
萌新初学莫队,悬赏 3 个关注
1028990
w2y51c318楼主2023/9/22 20:42

WA on 5

#include<bits/stdc++.h>
#define ld long double
#define ui unsigned int
#define ull unsigned long long
#define int long long
#define eb emplace_back
#define pb pop_back
#define ins insert
#define mp make_pair
#define pii pair<int,int>
#define fi first
#define se second
#define power(x) ((x)*(x))
using namespace std;

namespace FastIO
{
    template<typename T=int> inline T read()
    {
        T s=0,w=1; char c=getchar();
        while(!isdigit(c)) {if(c=='-') w=-1; c=getchar();}
        while(isdigit(c)) s=(s*10)+(c^48),c=getchar();
        return s*w;
    }
    template<typename T> inline void read(T &s)
    {
        s=0; int w=1; char c=getchar();
        while(!isdigit(c)) {if(c=='-') w=-1; c=getchar();}
        while(isdigit(c)) s=(s*10)+(c^48),c=getchar();
        s=s*w;
    }
    template<typename T,typename... Args> inline void read(T &x,Args &...args)
    {
        read(x),read(args...);
    }
    template<typename T> inline void write(T x,char ch)
    {
        if(x<0) x=-x,putchar('-');
        static char stk[25]; int top=0;
        do {stk[top++]=x%10+'0',x/=10;} while(x);
        while(top) putchar(stk[--top]);
        if(ch!='~') putchar(ch);
        return;
    }
}
using namespace FastIO;

namespace MTool
{   
    #define TA template<typename T,typename... Args>
    #define TT template<typename T>
    static const int Mod=1e9+7;
    TT inline void Swp(T &a,T &b) {T t=a;a=b;b=t;}
    TT inline void cmax(T &a,T b) {a=max(a,b);}
    TT inline void cmin(T &a,T b) {a=min(a,b);}
    TA inline void cmax(T &a,T b,Args... args) {a=max({a,b,args...});}
    TA inline void cmin(T &a,T b,Args... args) {a=min({a,b,args...});}
    TT inline void Madd(T &a,T b) {a=a+b>=Mod?a+b-Mod:a+b;}
    TT inline void Mdel(T &a,T b) {a=a-b<0?a-b+Mod:a-b;}
    TT inline void Mmul(T &a,T b) {a=a*b%Mod;}
    TT inline void Mmod(T &a) {a=(a%Mod+Mod)%Mod;}
    TT inline T Cadd(T a,T b) {return a+b>=Mod?a+b-Mod:a+b;}
    TT inline T Cdel(T a,T b) {return a-b<0?a-b+Mod:a-b;}
    TT inline T Cmul(T a,T b) {return a*b%Mod;}
    TT inline T Cmod(T a) {return (a%Mod+Mod)%Mod;}
    TA inline void Madd(T &a,T b,Args... args) {Madd(a,Cadd(b,args...));}
    TA inline void Mdel(T &a,T b,Args... args) {Mdel(a,Cadd(b,args...));}
    TA inline void Mmul(T &a,T b,Args... args) {Mmul(a,Cmul(b,args...));}
    TA inline T Cadd(T a,T b,Args... args) {return Cadd(Cadd(a,b),args...);}
    TA inline T Cdel(T a,T b,Args... args) {return Cdel(Cdel(a,b),args...);}
    TA inline T Cmul(T a,T b,Args... args) {return Cmul(Cmul(a,b),args...);}
    TT inline T qpow(T a,T b) {int res=1; while(b) {if(b&1) Mmul(res,a); Mmul(a,a); b>>=1;} return res;}
    TT inline T qmul(T a,T b) {int res=0; while(b) {if(b&1) Madd(res,a); Madd(a,a); b>>=1;} return res;}
    TT inline T spow(T a,T b) {int res=1; while(b) {if(b&1) res=qmul(res,a); a=qmul(a,a); b>>=1;} return res;}
    TT inline void exgcd(T A,T B,T &X,T &Y) {if(!B) return X=1,Y=0,void(); exgcd(B,A%B,Y,X),Y-=X*(A/B);}
    TT inline T Ginv(T x) {T A=0,B=0; exgcd(x,Mod,A,B); return Cmod(A);}
    #undef TT
    #undef TA
}
using namespace MTool;

inline void file()
{
    freopen(".in","r",stdin);
    freopen(".out","w",stdout);
    return;
}

bool Mbe;

namespace wycyyy
{
    static const int MAX=200010;
    static const int inf=2147483647;
    static const int INF=4557430888798830399;
    
    int n,m,blo,now,a[MAX];
	signed buc[MAX<<1],sum[MAX][170];
	int pfac[MAX][5],pcnt[MAX];
    vector<int> fact; int d[MAX<<1],cnt;
    struct query{signed l,r,id;}q[MAX]; int ans[MAX];
    #define nows (sum[q[i].r][j]-sum[q[i].l-1][j])
    
    namespace Math
    {
    	namespace Sieve
    	{
	    	constexpr int N=1000;
	    	int vis[N+10],P[N],Pcnt;
	    	inline void Linear_Sieve()
	    	{
	    		for(int i=2;i<=N;++i)
	    		{
	    			if(!vis[i]) P[++Pcnt]=i;
	    			for(int j=1;j<=Pcnt&&i*P[j]<=N;++j) {vis[i*P[j]]=1; if(!i%P[j]) break;}
				}
			}
			inline void SmallDeco(int i) {memcpy(sum[i],sum[i-1],sizeof sum[i]); for(int j=1;j<=Pcnt;++j) while(!a[i]%P[j]) ++sum[i][j],a[i]/=P[j];}
		}
		using namespace Sieve;
		namespace PrimeFactorization
		{
		    int seed,step;
		    static const int P[]={2,3,5,7,11,13,17,19,23,29,31,37};
		    static const int Pcnt=12;
		    inline int qmul(int a,int b,int mod) {int ans=a*b-(int)((long double)a*b/mod+0.5)*mod; return ans<0?ans+mod:ans;}
		    inline int qpow(int a,int b,int mod) {int res=1; while(b) {if(b&1) res=qmul(res,a,mod); a=qmul(a,a,mod); b>>=1;} return res;}
		    inline int f(int x,int mod) {return (qmul(x,x,mod)+seed)%mod;}
		    inline int randoom(int l,int r)
		    {
		        static mt19937_64 sd(20070707^time(NULL));
		        static uniform_int_distribution<int> range(l,r);
		        return range(sd);
		    }
		    inline bool Miller_Robin(int x)
		    {
		        if(x<=2) return x==2;
		        int y_=x-1; while(!(y_&1)) y_>>=1;
		        for(int i=0;i<Pcnt;++i)
		        {
		            if(x==P[i]) return 1;
		            int flag=0,y=y_,z=qpow(P[i],y,x);
		            if(z==1) flag=1;
		            else while(y<x-1)
		            {
		                if(z==x-1) {flag=1; break;}
		                y<<=1,z=qmul(z,z,x);
		            }
		            if(!flag) return 0;
		        }
		        return 1;
		    }
		    inline int floyd(int x)
		    {
		        seed=randoom(0,x-1);
		        int fast,slow,res=1; fast=slow=randoom(0,x-1);
		        fast=f(fast,x);
		        for(int i=0;slow!=fast;++i)
		        {
		            res=qmul(res,(fast-slow)%x+x,x);
		            if(!res) res=(fast-slow)%x+x;
		            if(i%step==0) {int g=gcd(res,x); if(g!=1) return g; res=1;}
		            slow=f(slow,x),fast=f(f(fast,x),x);
		        }
		        return gcd(res,x);
		    }
		    inline void Pollard_Rho(int x)
		    {
		        if(x==1) return;
		        if(Miller_Robin(x)) return fact.eb(x),void();
		        int k=1;
		        step=((int)log(x))<<1|1;
		        while(k==1) k=floyd(x);
		        Pollard_Rho(k),Pollard_Rho(x/k);
		    }
		    inline void BigDeco(int i) {fact.clear(),Pollard_Rho(a[i]); for(auto it:fact) d[++cnt]=it,pfac[i][++pcnt[i]]=it;}
		}
		using namespace PrimeFactorization;
	}
	using namespace Math;
	
    inline void mian()
    {
    	read(n),blo=n/sqrt((m<<1)/3),Linear_Sieve(),now=1;
    	for(int i=1;i<=n;++i) read(a[i]),SmallDeco(i),BigDeco(i);
    	sort(d+1,d+cnt+1),cnt=unique(d+1,d+cnt+1)-d-1;
    	for(int i=1;i<=n;++i) for(int j=1;j<=pcnt[i];++j) pfac[i][j]=lower_bound(d+1,d+cnt+1,pfac[i][j])-d;
		read(m); for(int i=1;i<=m;++i) read(q[i].l,q[i].r),q[i].id=i;
		sort(q+1,q+m+1,[](query a,query b){return (a.l/blo)!=(b.l/blo)?(a.l/blo)<(b.l/blo):((a.l/blo)&1)?(a.r<b.r):(a.r>b.r);});
		auto Add=[&](int x)->void{for(int i=1;i<=pcnt[x];++i) {if(buc[pfac[x][i]]==0) Mmul(now,d[pfac[x][i]]-1); else  Mmul(now,d[pfac[x][i]]); ++buc[pfac[x][i]];}};
		auto Del=[&](int x)->void{for(int i=1;i<=pcnt[x];++i) {if(buc[pfac[x][i]]==1) Mmul(now,Ginv(d[pfac[x][i]]-1)); else  Mmul(now,Ginv(d[pfac[x][i]])); --buc[pfac[x][i]];}};
		for(int i=1,l=1,r=0;i<=m;++i)
		{
			while(l>q[i].l) Add(--l);
			while(r<q[i].r) Add(++r);
			while(l<q[i].l) Del(l++);
			while(r>q[i].r) Del(r--);
			ans[q[i].id]=now; for(int j=1;j<=Math::Sieve::Pcnt;++j) if(nows) Mmul(ans[q[i].id],Math::Sieve::P[j]-1,MTool::qpow(Math::Sieve::P[j],nows*1ll-1));
		}
		for(int i=1;i<=m;++i) write(ans[i],'\n');
	}
}

bool Med;

signed main()
{
//  file();
    fprintf(stderr,"%.3lf MB\n",abs(&Med-&Mbe)/1048576.0);
    int Tbe=clock();
    wycyyy::mian();
    int Ted=clock();
    cerr<<1e3*(Ted-Tbe)/CLOCKS_PER_SEC<<" ms\n";
    return (0-0);
}
2023/9/22 20:42
加载中...