コード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 }