効果の対象に
あなたのn-タプルを与えます
Q.あなたは任意の二つのキーワードでドロップが整列されていないされていないされているいくつかの取り決めを持っていますか
分析
あなたは、包含と除外したいこと
私たちは、$!$ n個の合計数を追加する予定
キーワードで私たちの最初の並び替え後
場合は、同じ答えの値に影響しないので
だから、プログラムマイナスの$ \ prodにはsum_ {} AIの合計数を聞かせて!$へ
上述した第2キーワードの場合
私たちは、その後、最初のキーワードと第二のキーワードながら順序に従ってソート
に続いて、全プログラムの数プラス$ \ PROD和_ {(AI、BI)}!$
コード
#defineは長い長いint型 のconst int型のmod = 998244353を。 int型 P [ 300100 ]、N、M、アンス。 構造体ノード{ int型X、Y。 }。 ノードD [ 300100 ]。 インラインボイドのinit(){ int型I、J、K。 P [ 0 ] = 1 ; 用(i = 1 ; iが<= N; iが++)P [I] = P [I- 1 ] * I%MOD。 } インラインブール CMP1(CONSTノードA、CONST ノードb){ 場合(AX == BX)戻り AY < によって、 リターン斧< BX。 } インラインブール CMP2(CONSTノードA、CONST ノードb){ 戻り AY < によって、 } )(主符号付き{ int型I、J、K。 scanf関数(" %のLLD "、&N) その中に(); 用(i = 1 ; iが<= N; iは++)のscanf(" %のLLDの%のLLD "、&D [i]は.X、&D [i]の.Y)。 ANS = P [N]。 ソート(D + 1、D + N + 1 、CMP1)。 int型 RES = 1 ; 用(i = 1 iが<= N; I ++){ J = I; 一方、(J + 1 <= N && D [J + 1 ] .X == D [j]が.X)J ++ 。 RES = RES * P [J-I + 1 ]%のMOD。 私は = jは、 } アンス =(ANS-RES + MOD)%MOD。 ソート(D + 1、D + N + 1 、CMP2)。 RES = 1 。 用(i = 1 ; iが<= N; iは++ ){ J = I。 一方、(J + 1 <= N && D [J + 1 ] .Y == D [j]が.Y)J ++ 。 RES = RES * P [J-I + 1 ]%のMOD。 私は = jは、 } アンス =(ANS-RES + MOD)%MOD。 ソート(D + 1、D + N + 1 、CMP1)。 INT OK = 1 ; 以下のための(I = 2 iが++; iが<= N ) 場合(D [i]は.Y <D [I- 1 ]・Y){ OK = 0 。 破ります; } のRES = 1 。 もし(OK){ ための(I = 1; iが<= N; iは++){ J = I。 一方、(J + 1 <= N && D [J + 1 ] .Y == D [j]が.Y && D [J + 1 ] .X == D [j]が.X)J ++ 。 RES = RES * P [J-I + 1 ]%のMOD。 私は = jは、 } アンス =(ANS + RES)%MOD。 } COUT <<回答<< " の\ n " 。 リターン 0 ; }