これは、プッシュする非常に簡単です -
#include <設定> の#include <cstdioを> する#include <ストリング> の#include <アルゴリズム> の#define N 200000 の#defineっ長い長 の#define ULLのunsigned long長い 使用して名前空間std。 ボイドsetIO(文字列s){ = S内の文字列+、= sのうち+ "で" "アウト"。 freopenは(in.c_str()、 "R"、STDIN)。 // freopenは(out.c_str()、 "W"、STDOUT)。 } CAS int型。 マルチセット<LL> S; マルチセット<LL> ::イテレータit。 LL A [N]、P [N]、力[N]、[N]を報います。 LLのMULT(LLのX、LLのY、LL MOD){ LLのTMP =(長い二重)のx / MOD Y *。 リターン(MOD + * MOD(ULL)X * Y-(ULL)TMP)%MOD。 (; kは基地= MULT(ベース、ベース、MOD)、K >> = 1)のための IF(K&1) = MULT TMP(TMP、塩基、MOD)。 TMPを返します。 } (LLのB -1,11,11-&X、LL&Y)のLL exgcd { {場合(B!) X = 1、Y = 0。 返します。 } LL GCD = exgcd(B、%のB、x、y)は、TMP = X。 X = Y、Yは、TMP-A / Bの* yを=。 GCDを返します。 } ボイドは(){解決 S.clearを(); LL ANS、M、最大= 0。 I、J、N、M、フラグ= 0、nosol = 0 int型。 scanf関数( "%d個の%のD"、&N、&M)。 用(i = 1; iは= N <; ++ I)のscanf( "%のLLDを"、&A [I])。 用(i = 1; iは= N <; ++ I)のscanf( "%のLLDを" &P [I])。 用(i = 1; iは= N <; ++ I)のscanf( "%のLLD"、および報酬[I])。 用(i = 1; I <= M; ++ I)のscanf( "%のLLD"、&パワー[i])と、S.insert(パワー[I])。 用(i = 1; iが<= N; I ++){ LLのCUR。 それはS.upper_bound([I])を=。 もし(!それ= S.begin())it--。 CUR =(*これ)。 S.erase(それ)。 S.insert(報酬[I])。 マックス= MAX(最大値、A [i]が%のCUR == 0 A [I] / CUR:[I] / CUR + 1)。 ([I]> P [I]){もし フラグ= 1。 } 、B、X、Y、C、GCD LL。 = P [i]は、C = A [i]とB = CUR、。 GCD = exgcd(A、B、X、Y)、B = ABS(B / GCD)。 IF(C%でのGCD){ nosol = 1。 ブレーク; } X =(MULT(X、C / GCD、B)+ B)%のB; //当前这局的 (I == 1)ANS = xで、M = Bの場合、 他{ LLのcurans = xで、curM = B。 = M、B = curM、C = curans-ANS。 GCD = exgcd(A、B、X、Y)。 IF(C%GCD){ nosol = 1。 ブレーク; } B = ABS(B / GCD)。 X =(MULT(X、C / GCD、B)+ B)%のB; ANS + = Mの*のX; M * = curM / __ GCD(M、curM)。 ANS =(ANS%M + M)%のM。 } } もし(nosol)のprintf( " - N \ 1")。 他のprintf( "%LLDの\ nを"、フラグマックス:?ANS)。 } {main()のint型 I、J、T int型。 // setIO( "入力"); scanf関数( "%のD"、&T)。 用(CAS = 1; CAS <= T; ++ CAS) (解きます)。 0を返します。 }