UVA 11754コード偉業中国の剰余定理+列挙

 コードFeatUVA - 11754 

問題の意味:X C互いに素与えられた私は、各X用のI、KI Y与えJを ANS%X ANS満足する前に、QのI Yでの結果Jが発生しています。

中国の剰余定理が、合同式k個存在するルックIの生成物の組み合わせは、およびK iは最大の積が1E18で、直接中国の剰余定理は確かにのみペアkのない私のわずかに短い時間の積使用します。

kはときに私は、製品が大きい場合、それは各X-のために説明されて、私はそれがy軸だJたくさんあるので、我々はX-の1セットを選んだ私は TEMP = * X-ANSを設定し、私は y軸+ Jを、 TEMPを列挙する必要はありません。他の大型のX%満たすことができI = Y Jを

X-の基としては、私は、選択された、我々はすべてがY-で列挙高速であるため、Jできるだけ、X- iはできるだけ大きく、すなわち、kはI / X- I最低。

最後に、その出力形式、空白行の出力に注意してください。

  1の#include <cstdioを>
   2の#include < 設定 >
   3  使用して 名前空間STDを、
  4のtypedef 長い LL。
  5  のconst  int型 N = 15   6  INTのN、M。
  7  LLのBB [N]、CC [N]、CP。
  8   <LL> SS [N]。
  9のLL exgcd(-1,11,11-のB、LL&X、LL&Y){
 10      であれば(!{B)
 11          、X = 1 12          、Y = 0 13          リターンA;
14      }
 15      LL G = exgcd(B、%のB、Y、X)。
16      Y- = A / B * X。
17      リターンG。
18  }
 19  のLL INV(LLのC、LL){
 20      のLL G、X、Y。
21      G = exgcd(C、X、Y)。
22      リターングラムの== 1(X%C + c)は%で、C: - 1 23  }
 24  LLのCRT(){
 25      LL ANS = 0 、温度;
26      のためにint型 I = 0 ; iがN <I ++は{)
 27         TEMP = CP / ccの[I]。
28の          + = BB ANSは、[I] * TEMP * INV(TEMP、CC [I])。
29          であれば(ANS> = CP)ANS%= CP。
30      }
 31      のANS =(ANS + CP)%のCP。
32      もし(!ANS)ANS + = CP;
33の     リターンANS;
34  }
 35の 空隙 DFS(int型X){
 36      であれば(X == N){
 37の         SS [n]は.insert(CRT())。
38          リターン;
39      }
 40      のためにセット<LL> ::それはSS [X] .begin()=イテレータ;!それ= SS [X] .END();それ++ ){
 41の          BB [X] = * こと。
42の          DFS(X + 1 )。
43      }
 44  }
 45  空隙solve1(){
 46      、CP = 1 47      のためにint型 I = 0 ; iがN <; I ++)は、CP * = CC [i]は、
48の     SS [N] .clear();
49の      DFS(0 )。
50      LLのTEMP = 0 、ANS。
51      一方、(M){
 52          のためにセット<LL> ::イテレータが)SS [n]は.beginを(=、!それ= SS [N] .END();それ++ ){
 53              のANS =(※)+ TEMP * CP。
54              のprintf(" %LLDする\ n " 、ANS)。
55              M-- ;
56              場合(M!の)壊れます57          }
 58          TEMP ++ 59      }
 60  }
 61  空隙 solve2(int型P){
 62      のLL TEMP = 0 、ANS。
63      一方、(M){
 64          のためにセット!それ= SS [P] .END();それ++ <LL> ::それはSS [P] .begin()=イテレータ){
 65の              ANS =一時* CCの[P] +(* に)。
66              もし(!ANS)続けます67              ブールフラグ= 68              のためにint型 I = 0 ; iがN <; Iは++ ){
 69                  場合(I == p)を続けます70                  であれば(SS [i]が.find(ANS%のCC [I])== SS [I] .END()){
 71                      フラグ= 72                      ブレーク;
73                  }
 74             }
 75              であれば(フラグ){
 76                  のprintf(" %LLDする\ n " 、ANS)。
77                  M-- 78              }
 79              場合(M!の)破壊80          }
 81          TEMP ++ 82      }
 83  }
 84  INT メイン(){
 85      のint 、K、P。
86      LLのJI、X。
87      int型の T = 0 88      しばらく(〜のscanf("%D%D "&N、& M)){
 89          であれば(T)のprintf(" の\ n " );
 90          、T = 1 ; 
 91          P = - 1 ; JIは= 1 ;
 92          のためのint型 I = 0 ;私<N; iは++ ){
 93本の             SSを[I] .clear();
 94              のscanf(" %のLLD "、&CC [i])と、
 95              のscanf(" %dの"、&K);
 96件の              JI * = K。
97              であれば(p == - 1 || k個* CCの[P] <(INT)SS [P] .size()* CC [i])とP = I。
98              一方(k-- ){
 99                  のscanf(" %のLLD "、&x)は、
100の                 SS [i]は.insert(X)。 
101              }
 102          }
 103          であれば(JI <= 10000 )solve1();
104          solve2(P)。
105      }
 106      戻り 0 ;
107 }
独創的な分類は解決します

 

おすすめ

転載: www.cnblogs.com/LMCC1108/p/11689671.html