トピックポータル: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; }