【atcoder】GP 2 [agc036C]

  トピックポータル:https://atcoder.jp/contests/agc036/tasks/agc036_c

  トピックの効果:あなたは長さ$ N全体の$ 0初期シーケンスを与えるために、次の2つの異なる要素を見つけることができる各操作は、1つの増分1、2増分は、操作$ M $の後に尋ね、どのくらい表示されます異なるシーケンス。

  最終サンプルが得られたゲームの漏洩条件は、トラブルされていたときにこの質問を分析したが、行方不明の分析上の条件を考慮するとき、それはより複雑です。

  私たちはシーケンスを見つけることができる場合は、$があれば合法であると、それは、以下の条件を満たしている場合にのみ$:

    1. $ \ sum_ {i = 1} ^ {N} = a_iを3M $。

    2.全体の配列は、ほとんどの$ M $奇妙でした。

    3. $ \ MAX_ {i = 1} ^ {N} a_iを<= 2M $。

  $ M $数学的帰納法を検討する実証済み。

  我々は最初の三つの条件、列挙の$ I $の奇数を無視することができ、それは、選択と一緒に、偶数列の全体の数に相当している$ Iは、$ 1、プログラムの合計数$ \ sum_ {i = 1} ^ {\分(N、M)} \ binom {N} {I} \ binom {N-1 + 3M-I} {N-1} $、時間錯体の$ O(N + M)とすることができる$度計算の下で。

  そして、条件が満たさマイナススキーム3の数ではありません考えます。彼らは、元を満たしていればシーケンスは、我々が$ A_1 $と$ 2M $要素よりも大きいを厳選し、$ 2M $を差し引いことができるように、ほとんどの一つの要素で$ 2M $よりも大きいので、動作シーケンスと元のシーケンスので、条件2を満足する配列、条件3が満たされない場合、シーケンスは、以下の動作条件を満たした場合にのみ。

    A。$ \ sum_ {i = 1} ^ {N} = a_iを3M $。

    B.高々$ M $奇数の全配列。(マイナス$ 2M $は、パリティを変更しません)

    C。$ A_1> 0 $。

  我々は2つの部分の減算と考えられ、これらのプログラム:条件c Cプログラムを考慮違法な答えを減算無視して、私たちは、この条件は実施の形態を無視していることがわかったが、同様の手順を使用することができ、条件1と2上記の条件Cに似ています統計、帝国のC $のA_1 = 0 $、シーケンス全体のように直接翻訳、$ N $ 1、その後、統計までデクリメントなどの条件を考慮しながら。

  コード:

#include <cstdioを> 
する#include <CStringの> 
する#include <cmath> 
の#include <cstdlib> 
の#include <アルゴリズム>
 の#defineっ長い長
 の#define MOD 998244353
 の#defineのMod1(X)(X> = MOD X-MOD?: X)
 の#define?Mod2を(X)(X <0、X + MOD:X)
 の#define MAXN 3000010 
インライン読み取り11()
{ 
    LL、X = 0チャー C = GETCHAR()、F = 1 以下のための C <;(' 0 ' || ' 9 ' <C。- ')、F = - 1 (; ' 0 ' <= C && C <= ' 9 ' ; C = GETCHAR())X = X * 10 + C- ' 0 ' リターンのx *のF; 
} 
インラインボイドライト(LLのX)
{ 
    静的 INT BUF [ 20 ]においてlen; LEN = 0 ;
    もし(x < 0)は、x = -x、のputchar(' - ' )。
    (; X; X / = 10)BUF [LEN ++] = X%10 もしのputchar((LEN!)' 0 ' );
    他の 一方(LEN)のputchar(BUF [ - LEN] + ' 0 ' )。
} 
インラインボイドのwriteln(LLのX){書き込み(X)。putchar(' の\ n ' );} 
インラインボイド writesp(LLのX){書き込み(X)。putchar('  ' );} 
LL FAC [MAXN]、[MAXN] INV。
INTのN、M。
インラインLLパワー(LLのB、LL)
{ 
    LL ANS = 1 (; B; B >> = 1、= *%のMOD)
         場合(B&1)ANS = ANS *%のMOD。
    戻るANSを。
} 
インラインLL C(INT N、int型 M){ 戻り [M]%MOD * INV [nm]の%のINV * FAC [n]をMOD;} 
インラインLL計算値(整数 nは、整数 M、INT K)
{ 
    LL和 = 0 ;
    以下のためにint型 i = 0 ; iは= Kを<= N && <; iは++ 場合(!((MI)&1)&& M> = 1)合計=(和+ C(N、I)* C((MI)/ 2 + N- 1、N- 1))%MOD。
    // のwriteln(合計)。
    戻り値の合計。
} 
INT )(主
{ 
    N)(=読み取ります。M = 読み取ります(); 
    FAC [ 0 ] = INVは[ 0 ] = 1 以下のためにint型 i = 1 ; iが<= N + 3 * M; iは++ ){ 
        FAC [i]は = FAC [I- 1 ] * I%MOD。
        INV [I] =電力(FAC [i]は、mod- 2 )。
    } 
    LL ANS =(計算値(nは、3 *のM、M)-N *(計算値(N、M、M)-calc(N- 1、M、M)+ MOD))%MOD。
    writeln(Mod2を(ANS))。
    リターン 0; 
}
agc036C

 

おすすめ

転載: www.cnblogs.com/quzhizhou/p/11228893.html