中国の剰余定理
JAVAボード
/ * 中国の剰余定理、式に従って逆元多数の取得が必要* / インポートjava.math.BigIntegerのを、 インポートjava.util.ArrayListのの、 インポートjava.util.Scanner; パブリック クラスメイン{ 静的のBigInteger M [] = 新しい新 BigIntegerの[105 ]; 静的 BigIntegerのC [] = 新しい新規のBigInteger [105 ]; 静的 INT N-、 静的BigIntegerの_M、 静的BigIntegerのX、Y、 パブリック 静的BigIntegerの[] ex_gcd(BigIntegerのA、BigIntegerのB){ BigIntegerのANS。 BigIntegerの[]結果 = 新しい BigIntegerの[3 ]。 もし(b.equals(BigInteger.ZERO)) { 結果[ 0] = 。 結果[ 1] = BigInteger.ONE。 結果[ 2] = BigInteger.ZERO。 戻り値の結果; } のBigInteger [] TEMP = ex_gcd(B、a.mod(b)参照)。 ANS = TEMP [0 ]。 結果[ 0] = ANS。 結果[ 1] = TEMP [2 ]。 結果[ 2] = TEMP [1] .subtract((a.divide(b)参照)。乗算(TEMP [2]))。 // のSystem.out.printlnは(結果[0] + " "+結果[1] +"" +結果[2])。 戻り値の結果; } 静的BigIntegerのgetInv(BigIntegerの、のBigInteger MD) { // X = BigInteger.ZERO; Y = BigInteger.ZERO。 BigInteger D [] = ex_gcd(MD); // System.out.printlnは(A +」「+ MD); // のSystem.out.println(X +」「+ Y)。 // のSystem.out.println(D [1])。 リターン?(D [0] .equals(BigInteger.ONE))(D [1] .add(MD))MOD(MD):BigInteger.valueOf(-1 )。 } 静的 BigIntegerのexCRT(int型N) { BigIntegerのM1、M2、C1、C2、D。 以下のために(int型、I 2 =; iが<= N; iが++ ) { M 1 = M [I-1]; M2 = M [i]は、C1 = C [I-1]; C2 = C [i]は、 D = m1.gcd(M2)。 もし((c2.subtract(C1))MOD(D).equals(BigInteger.ZERO)!。)を返す BigInteger.valueOf(-1); // 此时无法合并 M [I] = mの[I-1 ] .multiply(M [i]が)分割(D)。 BigInteger T = (c2.subtract(C1))分割(D)。 // するSystem.out.println(T); C [I] =t.multiply(getInv(m1.divide(D)、m2.divide(D)))の.mod(m2.divide(D)).multiply(M1).add(C1)。 // のSystem.out.println(C [I])。 // のSystem.out.println(getInv(m1.divide(D)、m2.divide(D)))。 C [I] = ((C [I]の.mod(M [I])).add(M [I]))の.mod(M [I])。 // のSystem.out.println(M [I])。 } 戻りC [N]。 } パブリック 静的 ボイドメイン(文字列[]引数){ スキャナSC = 新しいスキャナ(System.in)。 N = sc.nextInt()。 _m =sc.nextBigInteger(); // int型のk = 0; 以下のために(int型 i = 1; iが<= N; iは++ ){ M [I] = sc.nextBigInteger()。 C [I] = sc.nextBigInteger()。 } のBigInteger ANS = exCRT(N)。 // するSystem.out.println(ANS)。 もし(ans.compareTo(_m)> 0 ){ System.out.printlnはは( "彼はおそらく横たわっていました" ); } そう であれば(ans.equals(BigInteger.valueOf(-1 ))){ System.out.printlnは(「彼は間違いなく横たわっていました」); } 他のSystem.out.println(ANS)。 } }