順列と除外のCF数

トピックへのリンク:https://www.luogu.org/problem/CF1207D

質問の意味:任意の次元で1-nから非減少満たすためならば、あなたに二次元の2次元のシーケンスを、与えるために、悪いシーケンスであり、それ以外の場合は良い順序で、どのように多くの良い順序でソートを問い合わせます

分析:モノトーンは、第1および第2の次元の最初の行はそれぞれ、C1は、C2、次いで同時に、最初の行を満たし、第2の次元は非減少の総数を得ることができ、C3と呼ばれます

したがって、答えは:n個(合計) - (C1 + C2-C3)(悪いシーケンス番号)!

さらに剰余乗算の後に減少また、この設計は、直接処理することができます

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
typedefの長い 長いLL。
const  int型 MAXN = 3E5 + 7 const  int型 INF = 0x3f3f3f3f const  int型 N = 1E7;
constの LL MOD = 998244353 ;
#define meminf(A)のmemset(0x3fを、はsizeof(A))
 の#define MEM0(A)のmemset(0、はsizeof(A))
 構造体ノード{
     int型X、Y。
} [MAXN]。
ブール CMP1(ノードA、ノード&B){
     戻り AX < BX。
} 
ブール CMP2(CONSTノードと、CONSTノード&B){
     戻り AY < によって、
} 
ブール CMP3(CONSTノードと、CONSTノード&B){
     戻り AX == BX AY <によって:AX < BX。
} 
int型のmain(){
     int型のn; scanf関数(" %のD "、&N)
    int型 i = 1 ; iが<= N; iが++)のscanf(" %D%dの"、および[I] .X、&[I] .Y)。
    ソート(A + 1、A + 1 + 、N-、CMP1); 
    LLのFX = 1 、K;
     // 非減少第一次元のFXレコード番号
    のためにINT I = 1 ; I <= N; I ++は){
         IF([I]。 ==のX [I- 1 ] .X)K ++ 他の K = 1。; 
        FX =(K * FX)%MOD; 
    } 
    ソート(A + 1、A + 1 + 、N-、CMP2); 
    LL FY = 1 ;
     のためINT I = 1 ; I <= N; I ++ ){
        もし([I] .Y == A [I- 1 ]・Y)は、k ++ ;
        のk = 1 ; 
        FY =(FY * K)%のMOD。
    } 
    ソート(A + 1、+ 1 + N、CMP3)。
    LL F = 1 以下のためにint型 i = 1 ; iは= N <; iは++ ){
         場合([i]が.Y <[I- 1 ]・Y){ 
            F = 0 破ります; 
        } 
    } 
    もし、(F){
         ためINTi = 1 ; iは= <N; iは++ ){
             場合([i]が.Y == A [I- 1 ] .Y && [I] .X == A [I- 1 ] .X)K ++ のk = 1 ; 
            F =(F *のkの)%MOD。
        } 
    } 
    のLLのRES =(FX + FY-F + MOD)%MOD。
    LL RES2 = 1 以下のためにint型 i = 1 ; iが<= N; iは++)RES2 =(RES2 * I)%MOD。
    printf(" %LLDする\ n "、(RES2-RES + MOD)%のMOD)。
    リターン 0  ;
}

 

おすすめ

転載: www.cnblogs.com/qingjiuling/p/11423923.html