質問が意図されて:あなた二つの整数の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を返します。 }