毎日格上の問題を倒すやつの48日目です。*1
問題リンク
問題概要
長さ の数列 が与えられるよ。
和が 以下のすべての数列 に対して、 を求めて、その総和を で割った余りを求めてね。
解法
負の二項定理を使って解くのが簡潔です。
これは、 というものです。まさに今回使えそうなものです。
とりあえずすべての に対してやってみると、 の総和を として [(1-x)^{-(S+N)}] の何項目かまでの総和を求めたいわけです。
とりあえず、総和を求めるのはきついので で割って の何項目かを求めることにします。
結論としては、 を求めればよかったりします。これはいい感じに式変形すれば求まります。
結局、答えは です。
提出コード
MOD=10**9+7 N,M=map(int,input().split()) A=list(map(int,input().split())) cnt=sum(A)+N up=cnt+M-sum(A) ans=1 #print(cnt,up) for i in range(cnt): ans*=up-i ans*=pow(i+1,-1,MOD) ans%=MOD print(ans)
Submission #47346140 - AtCoder Regular Contest 110 (Sponsored by KAJIMA CORPORATION)
感想
mod998244353だと思ってて死ぬほど苦戦した