#MMA Contest 015 I ''' 一番左のスライムを食べる。 食べた後、左からi番目のスライムがBiならボーナス獲得。 最適化しろ。 愚直にシミュレーションしたいが、いやまて、制約がすごいことになっているぞ。 スライドさせたら答え出たりしないかな。 無理だな。捨て。 ■AfterContest 畳み込みで解ける事が分かったので畳み込みます。 事前にスライムの配列を反転させておき、各色ごとに一致時にもらえる点数の配列も用意しておけば 各色で畳み込んで結果を合成することでACできそう。やってみよう。 NTT遅すぎるんだけど。なんだこれ。 やはりnumpyは全てを解決する。 ''' #MOD = 998244353 にのみ対応したFFT。それ以外では機能しません。 class NTT_998244353: def __init__(self,MOD=998244353): self._MOD=998244353 def _FFT(self,f,fft_len,IDFT=False): h=0 while 2**h < max(len(f),fft_len): h+=1 f+=[0]*(2**h - len(f)); P=pow(3,119*2**(23-h),self._MOD) if IDFT: P=pow(P,2**h-1,self._MOD); rev=pow(2**h,self._MOD-2,self._MOD) for i in range(2**h): #バタフライ演算の並び替え j=0 for k in range(h): j|=(i>>k&1)<<(h-1-k) if i