这一题看题目很容易想到要使用前缀积,但是在求区间乘积的时候,会用到除法,这就不能单纯除,而是应该改成乘上模逆元,在Java中,求模拟元可以使用BigInteger自带的方法,modInverse(mod),这样就可以省略很多代码

最后输出结果就行


import java.math.BigInteger;
import java.util.Scanner;
public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int q=sc.nextInt();
		long a[]=new long[n+5];
		long d[]=new long[n+5];
		d[0]=1;
		BigInteger mod=new BigInteger("1000000007");
		for(int i=1;i<=n;i++) {
			a[i]=sc.nextLong();
			if(i==1) {
				d[i]=a[i];
			}else {
				d[i]=(d[i-1]*a[i])%(1000000007);
			}
			
		}
		StringBuilder sb=new StringBuilder();
		while(q-->0) {
			int l=sc.nextInt();
			int r=sc.nextInt();
			BigInteger x=new BigInteger(""+d[l-1]).modInverse(mod);
			sb.append(new BigInteger(""+d[r]).multiply(x).mod(mod));
			sb.append(" ");
		}
		System.out.println(sb);
		
		
		

	}

}