問題の意味:指定された数N []、1 <= BとB []、今形成新しい配列 [I] <= [I]。すべてのプログラムとのQ.最大値。
アイデア:最初の注文。その後<[I-1]と仮定すると、統計的寄与をセグメンテーション [I]、 次いで[I-1] + 1、[I]] 寄与はそれが正当なものである、プログラムの*正当な権利のすべてのプログラムを残しましたこの範囲内の最大値です。
最大= xを仮定し、右側の寄与があるのx *(X ^(N-I + 1) - (X-1)*(N-I + 1));すべてのxプレフィックスを見つけてまで追加、= X ^(N-I + 2)+(X-1)^(N-I + 1)+ ... ^(N-I + 1);右端部はラグランジュを用いて決定することができます。
すべてが終了されるだろう。しかし、私のボードが少し遅いようです。
(すべての後、私は明日それを変更し、余分なログを追加しました。今日補うためにいくつかの質問があります。
(しかし、現実にはそれはボードの準備のためにあります。
<ビット/ STDC ++ H>の#include の#defineは長い長いっ の#define REPは(iは、、B)のための式(I ++; iが= Bを<Iは= INT) 使用して 名前空間STDを、 const int型 MAXN = 200010 ; const int型のMod = 1E9 + 7 。 const int型 MOD = 1E9 + 7 。 int型[MAXN] [MAXN]、合計を、ANS; LL F [MAXN]、FAC [MAXN]、[MAXN] INV。 P(-1,11,11- b)はLL { LL ANS = 1 。 一方、(b)は、{ もし、(B&1)ANS = ANS *%のMOD。 B >> =1 ; = A *%のMOD。 } 場合(ANS < 0)ANS + = MOD。 戻るANSを。 } ボイドのinit(int型TOT) { FAC [ 0 ] = 1 。 用(int型 I = 1 ; I <= TOT; iが++ ) FAC [i]は = FAC [I- 1 ] * I%MOD。 INV [TOT] = P(FAC [TOT]、mod- 2 )。 INV [ 0 ] = 1 ; // 求阶乘逆元 のための(int型 I = tot-1 ; I> = 1 ; i-- ) INV [I] = INVを[I + 1 ] *(I + 1)%MOD。 } LLラグランジュ(LL N、LLのK) { 担当者(I、1、K + 1)[I] =([I-F F 1 ] + P(I、K- 1%))MOD。 もし(N <= K + 1)リターンF [N]。 INT TOT = K + 1 。INIT(TOT)。 LL ANS = 0、今= 1 。 以下のために(int型私は= 1 ; I <= TOT;私は++)は今%(NI)*今=モッズ; 用(int型 I = 1 ; I <= TOT iが++ ){ LL INV1 = P(NI、mod- 2 )。 LL INV2 = INV [I- 1 ] * INV [TOT-I]%MOD。 もし((TOT-I)&1)INV2 = mod- INV2。 LLの一時今* INV1%= MOD; TEMP =一時* Fを[I]%のMOD * INV2%MOD。 ANS + = 温度; もし ans- =(ANS> = MOD)MOD。 } 戻りANS。 } int型解く(int型のx、int型K) { もし!(x)をリターン 0 。 戻り P(X、K + 1)-Lagrange(X- 1、K + 1 )。 } int型のmain() { int型のN。 一方、(〜のscanf(" %dの"、&N)){ 担当者(I、1、N)のscanf(" %dの"、および[I])。 ソート(A + 1、+ N + 1)。ANS = 0 ; 和[ 0 ] = 1 。 担当者(I、1、N)の和[i]は= 1LL *和[I- 1 ] * [I]%のMod。 担当者(I、1 、N){ 場合([I] == A [I- 1 ])続けます。 INTのRES =(解く([I]、N-I + 1)-solve([I- 1 ]、N-I + 1)+ MOD)%のMod。 (ANS + = 1LL *和[I- 1 ] * RES%MOD)%= モッド。 } のprintf(" %d個の\ n " 、ANS)。 } 戻り 0 。 }