教育Codeforcesラウンド71社説D

これは、対象の順列です。

同じ要素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対< INTINT > 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 }

 

おすすめ

転載: www.cnblogs.com/Msmw/p/11423595.html