2019牛客暑期多校训练营(第十场)D:Han Xin and His Troops

Han Xin and His Troops

扩展中国剩余定理模板题,但是会爆long long。

java大数代码

import java.math.BigInteger;
import java.util.Scanner;
import java.util.*;
import java.io.*;
public class Main {
	static BigInteger a[]=new BigInteger[100005];
	static BigInteger m[]=new BigInteger[100005];
	static int n;
	static BigInteger[] exgcd(BigInteger a,BigInteger b) {
		BigInteger res[]=new BigInteger[3];
		if (b.compareTo(BigInteger.ZERO)==0) {
			res[0]=a;
			res[1]=BigInteger.ONE;
			res[2]=BigInteger.ZERO;
			return res;
		}	
		BigInteger[] tmp=exgcd(b,a.mod(b));
		res[0]=tmp[0];
		res[1]=tmp[2];
		res[2]=tmp[1].subtract(a.divide(b).multiply(tmp[2]));
		return res;
	}
	static BigInteger excrt() {
		BigInteger M=BigInteger.valueOf(1),A=BigInteger.valueOf(0);
		for (int i=1;i<=n;i++) {
			BigInteger[] rrr=exgcd(M,m[i]);
			BigInteger d=rrr[0];
			BigInteger x1=rrr[1];
			BigInteger y1=rrr[2];
			BigInteger mm=m[i].divide(d);
			if (((a[i].subtract(A)).mod(d)).compareTo(BigInteger.ZERO)!=0 ) {return BigInteger.valueOf(-1);}
			x1=x1.mod(mm);
			BigInteger k=(((((a[i].subtract(A)).divide(d)).multiply(x1)).mod(mm))).mod(mm);
			BigInteger nM=M.multiply(mm);
			A=A.add((k.multiply(M).mod(nM)));
			M=nM;
		}
		return A; 
	}
	public static void main(String[] args) {
		Scanner cin=new Scanner(System.in);
		n=cin.nextInt();
		BigInteger m1;
		m1=cin.nextBigInteger();
		for(int i=1;i<=n;i++) {
			m[i]=cin.nextBigInteger();
			a[i]=cin.nextBigInteger();
		}
		BigInteger ans=excrt();
		if(ans.compareTo(m1)==1)
			System.out.println("he was probably lying");
		else if(ans.compareTo(BigInteger.valueOf(-1))==0)
			System.out.println("he was definitely lying");
		else if(ans.compareTo(m1)==-1)
			System.out.println(ans);
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值