韓信と彼の軍隊

韓信と彼の軍隊

中国の剰余定理

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)。
 
        } 
 
}

 

おすすめ

転載: www.cnblogs.com/liulex/p/11370275.html