結果
問題 | No.215 素数サイコロと合成数サイコロ (3-Hard) |
ユーザー | 37zigen |
提出日時 | 2020-09-23 20:53:31 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,119 bytes |
コンパイル時間 | 190 ms |
コンパイル使用メモリ | 12,800 KB |
実行使用メモリ | 63,884 KB |
最終ジャッジ日時 | 2024-06-28 03:02:20 |
合計ジャッジ時間 | 11,143 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ソースコード
import numpy as np MOD=10**9+7 def mul(a, b, MOD=MOD): fft=np.fft def submul(f,g): L=len(f)+len(g)-1 return fft.irfft(fft.rfft(f,L)*fft.rfft(g,L),L)%MOD al=a & (1<<15)-1 bl=b & (1<<15)-1 ah=a>>15 bh=b>>15 x,y,z=submul(al,bl),submul(ah,bh),submul(al+ah,bl+bh) x,y,z=map(lambda v:(v+.5).astype(np.int64),[x,y,z]) return (x+(y<<30)+((z-x-y)<<15))%MOD def coef_of_generating_function(P, Q, N): while N: Q1=Q.copy() Q1[1::2]=np.negative(Q1[1::2]) P=mul(P,Q1) if N&1: P=P[1::2] else: P=P[::2] Q=mul(Q,Q1)[::2] N//=2 return P[0] def f(dice,n): U=(n+1)*dice[-1] dp=np.zeros((n+1,U+100),dtype=np.int64) dp[0][0]=1 for add in dice: for i in range(n): for u in range(U): dp[i+1][u+add]+=dp[i][u] dp[i+1][u+add]%=MOD return dp[n] N,P,C=map(int,input().split()) a=f([2,3,5,7,11,13],P) b=f([4,6,8,9,10,12],C) c=mul(a,b) den=-c den[0]=1 g=c[::-1].cumsum()[::-1]%MOD g[0]=0 print(coef_of_generating_function(g,den,N))