题解 | 子数列求积

子数列求积

https://www.nowcoder.com/practice/5daab034da954f5697dcf96c1808d34f

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

	}

}

全部评论
这一题要注意,前面的前缀积数组不能使用BigInteger,会超时,而是使用long数组,效果是一样的,因为都要取模
点赞 回复 分享
发布于 03-25 19:14 江西

相关推荐

zzzilik:没事的,才刚刚开始,后面会捞的,这个三天没人发起面试自动结束,但是面试官还是能看到简历,四月份主战场会慢慢捞
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务