結果

問題 No.3285 Chorus with Friends
ユーザー hirayuu_yc
提出日時 2025-09-22 10:13:37
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 647 ms / 3,000 ms
コード長 1,473 bytes
コンパイル時間 4,901 ms
コンパイル使用メモリ 81,936 KB
実行使用メモリ 232,936 KB
最終ジャッジ日時 2025-09-22 21:40:20
合計ジャッジ時間 5,936 ms
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 40
権限があれば一括ダウンロードができます

ソースコード

diff #

MOD=998244353
def solve(a):
    n=len(a)
    if n==0:
        return 0
    m=len(a[0])
    if n<m:
        dp=[0]*(1<<n)
        dp[-1]=1
        for i in range(m):
            ndp=[0]*(1<<n)
            for j in range(1<<n):
                dp[j]%=MOD
                if dp[j]==0:
                    continue
                for k in range(n):
                    nxt=1
                    if i==m-1 or a[k][i+1]!=a[0][0]:
                        nxt=0
                    if (j>>k)&1:
                        ndp[j-(1<<k)+(nxt<<k)]+=dp[j]
            dp=ndp
        return sum(dp)
    else:
        dp=[[0]*(1<<m) for i in range(m+1)]
        dp[0][0]=1
        for i in range(n):
            for j in range(m):
                for k in range(1<<m):
                    dp[j][k]%=MOD
                    if dp[j][k]==0:
                        continue
                    dp[j+1][k]+=dp[j][k]
                    if ((k>>j)&1)==0:
                        if j==m-1 or a[i][j+1]!=a[0][0]:
                            dp[m][k+(1<<j)]+=dp[j][k]
                        else:
                            dp[j+1][k+(1<<j)]+=dp[j][k]
            dp=[dp[-1][:]]+[[0]*(1<<m) for i in range(m)]
        return dp[0][-1]
    return 0
    
    
N,M=map(int,input().split())
A=[list(map(int,input().split())) for i in range(N)]
ans=0
for i in range(301):
    a=[]
    for j in range(N):
        if A[j][0]==i:
            a.append(A[j][:])
    ans+=solve(a)
    ans%=MOD
print(ans)
0