順列のCF 1027D数

質問が意図されて:あなた二つの整数のnシーケンスを与える:(A1、B1)、(A2、B2)、···、(BN)。最初の要素に係る非降順であれば、

          あるいは、この配列が悪いシーケンス二要素による非降順と呼ばれます。それ以外の場合は順番が良いです。どのように多くの種類の出力のこの配置は良いシーケンスであるように。

 

アイデア:あなたが最初のnマイナスの数の悪い種子は順序とすることができ、その後、種の悪いシーケンス番号を見つけることができる限り、Bどの順序で悪いほど悪く配列の配列、そうで!

           いくつかの不良シーケンス番号は悪い種の配列と同じである-a + B種の悪いシーケンス番号、B同時にいくつかの悪い配列です。

書式#include <cstdioを> 
する#include <CStringの> 
の#include <cmath> 
の#include <アルゴリズム> 
書式#include <iostreamの> 
の#include <キュー> 
std名前空間を使用しました。
#defineは長い長いっ
LL INF = 998244353。
構造体ノード
{ 
    LLのX。
    LLのY。
} [300005]。
ブールCMP(ノードXX、ノードYY)
{ 
    IF(xx.xの== yy.x)
        xx.y <yy.y返します。
    xx.xの<yy.x返します。
} 
のLL B [300005]、C [300005]。
LL楽しい(LL n)で
{ 
    LL S = 1。
    以下のために(LL I = 2; iが<= N; iは++)
        S =(S * I)%のINF。
    リターンの%のinfファイル。
} 
メインINT()
{ 
    LL N。
    (〜のscanf( "%のLLD"、&n))は、一方
    { 
        用(LL i = 1; iが++; iが<= N)
        { 
            scanf関数( "%のLLDの%のLLD"、および[I] .X、&[I]。 Y); 
            B [I] = [I] .X。
            C [i]は= [I] .Y。
        } 
        ソート(B + 1、B + N + 1)。
        ソート(C + 1、C + N + 1)。
        LL ANS = 1、和= 1、SUM1 = 1、SUM2 = 1。
        LL、S = 1、S1 = 1。
        (LL I = 2 iが++; iが<= n)のための
        { 
            (B [I] == B [I-1])場合
                ++です。
            他の
            { 
                合計=(合計*楽しい(S))%のinfファイル。
                S = 1。
            } 
            (C [I] == C [I-1])であれば
                S1 ++。 
            { 
            {
                SUM1 =(SUM1 *楽しい(S1))%のinfファイル。
                S1 = 1。
            } 
        } 
        もし、(B [n]は== B [N-1])
            の合計=(SUM *楽しい(S))%のINF。
        IF(C [N] == C [N-1])
            SUM1 =(SUM1 *楽しい(S1))%のINF。
        ソート(A + 1、A + N + 1、CMP)。
        S = 1。
        int型のV = 1; 
        以下のために(LL I = 2; iが<= N; iは++)
        { 
            IF([I] .X == A [I-1] .X && [I] .Y == A [I-1] .Y)
                S ++ ; 
            他の
            { 
                SUM2 =(SUM2 *楽しい(S))%のinfファイル。
                S = 1。
            } 
            ([I] .Y <[I-1]・Y)であれば
                ブレーク;
                V = 0; 
            } 
        } 
        もし([N] .X == A [N-1] .X && [N]・Y == [N-1]・Y)
            SUM2 =(SUM2 *楽しい(S))%のINF。
        IF(V == 0)
            SUM2 = 0。
        合計=(SUM1 +和+ INF-SUM2)%のINF。
        ANS =楽しさ(N); 
        ANS =(ANS + INF-和)%のINF。
        printf( "%LLDする\ n"、ANS)。
    } 
    0を返します。
}

  

おすすめ

転載: www.cnblogs.com/zcb123456789/p/11403701.html