class Lazy_Evaluation_Tree(): def __init__(self,L,calc,unit,op,comp,id,index): """calcを演算,opを作用とするリストLのSegment Treeを作成 calc:演算 unit:モノイドcalcの単位元 (xe=ex=xを満たすe) op:作用素 comp:作用素の合成 id:恒等写像 [条件] M:Monoid,F={f:F x M→ M:作用素}に対して,以下が成立する. Fは恒等写像 id を含む.つまり,任意の x in M に対して id(x)=x Fは写像の合成に閉じている.つまり,任意の f,g in F に対して, comp(f,g) in F 任意の f in F, x,y in M に対して,f(xy)=f(x)f(y)である. [注記] 作用素は左から掛ける.更新も左から. """ self.calc=calc self.unit=unit self.op=op self.comp=comp self.id=id self.index=index N=len(L) d=max(1,(N-1).bit_length()) k=1<>h) #配列の第m要素より上を全て再計算 def _recalc_above(self,m): while m>1: m>>=1 self.data[m]=self.calc( self._eval_at(m<<1), self._eval_at(m<<1|1) ) def get(self,k): index=self.index m=k-index+self.N self._propagate_above(m) self.data[m]=self._eval_at(m) self.lazy[m]=self.id return self.data[m] #作用 def operate(self,From,To,alpha,left_closed=True,right_closed=True): index=self.index L=(From-index)+self.N+(not left_closed) R=(To-index)+self.N+(right_closed) L0=R0=-1 X,Y=L,R-1 while X>=1 Y>>=1 L0=max(L0,X) R0=max(R0,Y) self._propagate_above(L0) self._propagate_above(R0) while L>=1 R>>=1 self._recalc_above(L0) self._recalc_above(R0) def update(self,k,x): """ 第k要素をxに変更する. """ index=self.index m=k-index+self.N self._propagate_above(m) self.data[m]=x self.lazy[m]=self.id self._recalc_above(m) def product(self,From,To,left_closed=True,right_closed=True): index=self.index L=(From-index)+self.N+(not left_closed) R=(To-index)+self.N+(right_closed) L0=R0=-1 X,Y=L,R-1 while X>=1 Y>>=1 L0=max(L0,X) R0=max(R0,Y) self._propagate_above(L0) self._propagate_above(R0) vL=vR=self.unit while L>=1 R>>=1 return self.calc(vL,vR) def all_product(self): return self.product(1,self.N,1) #リフレッシュ def refresh(self): for m in range(1,2*self.N): self.data[m]=self._eval_at(m) if m>32,x&msk b,q=y>>32,y&msk c,r=(a+b)%Mod,(p+q) return (c<<32)+r def op1(t,x): a,p=x>>32,x&msk t=(p*t)%Mod return (t<<32)+p def op2(t,x): a,p=x>>32,x&msk t=(p*pow(t,2,Mod))%Mod return (t<<32)+p def op3(t,x): a,p=x>>32,x&msk t=(p*pow(t,3,Mod))%Mod return (t<<32)+p def op4(t,x): a,p=x>>32,x&msk t=(p*pow(t,4,Mod))%Mod return (t<<32)+p def comp(a,b): return a #================================================ def product_mod(*A): x=1 for a in A: x*=a x%=Mod return x #================================================ import sys from operator import add input=sys.stdin.readline write=sys.stdout.write N=int(input()) A=list(map(int,input().split())) Mod=10**9+7 msk=(1<<32)-1 L_inv=[0]*(N+1) L_inv[1]=1 for k in range(2,N+1): q,r=divmod(Mod,k) L_inv[k]=(-q*L_inv[r])%Mod X=[] Z1=Lazy_Evaluation_Tree([(a<<32)+1 for a in A],calc,0,op1,comp,-1,1) Z2=Lazy_Evaluation_Tree([(pow(a,2,Mod)<<32)+1 for a in A],calc,0,op2,comp,-1,1) Z3=Lazy_Evaluation_Tree([(pow(a,3,Mod)<<32)+1 for a in A],calc,0,op3,comp,-1,1) Z4=Lazy_Evaluation_Tree([(pow(a,4,Mod)<<32)+1 for a in A],calc,0,op4,comp,-1,1) Q=int(input()) for _ in range(Q): T,*Y=map(int,input().split()) if T==0: U,V,W,B=Y if U>V: U,V=V,U if UV: U,V=V,U if U>32 T2=Z2.product(U,V)>>32 T3=Z3.product(U,V)>>32 T4=Z4.product(U,V)>>32 else: L=U+(N-V+1) T1=calc(Z1.product(1,U),Z1.product(V,N))>>32 T2=calc(Z2.product(1,U),Z2.product(V,N))>>32 T3=calc(Z3.product(1,U),Z3.product(V,N))>>32 T4=calc(Z4.product(1,U),Z4.product(V,N))>>32 l_inv=L_inv[L] if T==2: E=T2-product_mod(T1,T1,l_inv) elif T==3: E=T3-3*product_mod(T2,T1,l_inv)+2*product_mod(T1,T1,T1,l_inv,l_inv) else: E=T4-4*product_mod(T3,T1,l_inv)+6*product_mod(T2,T1,T1,l_inv,l_inv)-3*product_mod(pow(T1,4,Mod),pow(l_inv,3,Mod)) E%=Mod E=(E*l_inv)%Mod X.append(E) write("\n".join(map(str,X)))