これは、対象の順列です。
同じ要素A1、A2 ...そんなに悪い順列C1がある場合=はA1 * A2 * ... 2番目のキーと同じ、C2を取得し、N!順列の実施形態では、最初のキーワードの合計まで観察。しかし、重複配列を削除することが可能であるので、悪い順列のマイナス2種類の合計が、明らかに間違っている場合は、繰り返しのように一緒にこれを入れて、整然とした最初のキーワードである、また、2番目のキーワードを命じました。最終ANS = N!-C1-C2 + C3。
爆撃を法である必要があり、あなた自身の時間を書いて、そして非常に良い書き込みを見つけました。参考のために
1つの#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 typedefの長い 長いLL。 4 のconst int型 MAXN = 3E5 + 5 。 5 CONSTの LLのMOD = 998244353 。 6 7対< INT、INT > A [MAXN]。 8 LL D [MAXN]。 9 LL Fiの[MAXN]、SE [MAXN]。 10地図<ペア< 整数、整数 >、INT > M。 11 INT N。 12LL和= 1 ; LL E = 1、B = 1、C = 1 。 13 INT メイン(){ 14 CIN >> N。 15 D [ 0 ] = 1 。 16 のために(int型 i = 1 ; iが<= N; iが++ ){ 17 CIN >> [i]が1次回>> [I] .second。 18 D [I] =(D [I- 1 ] * I)%MOD。 19 、E = E×(++ Fiの[I] 1次回])%MOD。 20 、B = B *(++ SE [I] .second])%のMOD。 21 C = C *(++ M [I])%モッズ; 22 } 23 ソート(A + 1、+ N + 1 )。 24 25 INTは今= [ 1 ] .second。int型の記号= 1 ; 26 のために(int型、I = 2 ; iが<= N; iが++ ){ 27の 場合([i]は.second> = NOW)今= [I] .secondと、 28 他の 29 { 30 サイン= 0 。 31 ブレーク; 32 } 33 } 34件 のLL ANS。 35 であれば(記号) 36 { 37件 のANS =(D [N] + C + 2 * MOD-EB)%MOD。 38 } 39 他 ANS =(D [N] + 2 * MOD-EB)%MOD。 40 coutの<< ANS << " \ nを" ; 41 42 43 戻り 0 ; 44 }