这一题看题目很容易想到要使用前缀积,但是在求区间乘积的时候,会用到除法,这就不能单纯除,而是应该改成乘上模逆元,在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);
}
}



京公网安备 11010502036488号