結果
問題 | No.2907 Business Revealing Dora Tiles |
ユーザー |
👑 |
提出日時 | 2024-06-07 10:37:18 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 5,871 bytes |
コンパイル時間 | 6,068 ms |
コンパイル使用メモリ | 82,180 KB |
実行使用メモリ | 100,728 KB |
最終ジャッジ日時 | 2024-09-23 12:17:54 |
合計ジャッジ時間 | 72,881 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 41 TLE * 1 -- * 15 |
ソースコード
from itertools import combinationsnim_prod_table=[[0]*256 for _ in range(256)]nim_inv_table=[0]*65536def nim_prod_precalc():nim_prod_table[0][0]=0nim_prod_table[0][1]=0nim_prod_table[1][0]=0nim_prod_table[1][1]=1nim_inv_table[1]=1for d in range(3):p=1<<dfor a in range(1<<(2*p)):for b in range(1<<p, 1<<(2*p)):a_h=a>>pa_l=a-(a_h<<p)b_h=b>>pb_l=b-(b_h<<p)al_bl=nim_prod_table[a_l][b_l]ahl_bhl=nim_prod_table[a_h^a_l][b_h^b_l]ah_bh=nim_prod_table[a_h][b_h]ah_bh_h=nim_prod_table[ah_bh][1<<(p-1)]nim_prod_table[a][b]=nim_prod_table[b][a]=((al_bl^ahl_bhl)<<p)^(al_bl^ah_bh_h)if nim_prod_table[a][b]==1:nim_inv_table[a]=bnim_inv_table[b]=adef nim_product_power(a: int, n: int, p: int=64) -> int:if p==64:if a<(1<<8) and n<8:p=8elif a<(1<<16) and n<16:p=16elif a<(1<<32) and n<32:p=32if p==8:return nim_prod_table[a][1<<n]p//=2a_h=a>>pa_l=a-(a_h<<p)if n<p:return (nim_product_power(a_h, n, p)<<p)^nim_product_power(a_l, n, p)else:n-=preturn (nim_product_power(a_h^a_l, n, p)<<p)^nim_product_power(nim_product_power(a_h, n, p), p-1, p)def nim_square(a: int, p: int=64) -> int:if p==64:if a<(1<<8):p=8elif a<(1<<16):p=16elif a<(1<<32):p=32if p==8:return nim_prod_table[a][a]p//=2a_h=a>>pa_l=a-(a_h << p)h_sq=nim_square(a_h, p)l_sq=nim_square(a_l, p)return (h_sq<<p)^nim_product_power(h_sq, p-1, p)^l_sqdef nim_product(a: int, b: int, p: int=64) -> int:if a==0 or b==0:return 0if a==1:return bif b==1:return aif p==64:if a<(1<<8) and b<(1<<8):p=8elif a<(1<<16) and b<(1<<16):p=16elif a<(1<<32) and b<(1<<32):p=32if p==8:return nim_prod_table[a][b]p//=2a_h=a>>pa_l=a-(a_h<<p)b_h=b>>pb_l=b-(b_h<<p)al_bl=nim_product(a_l, b_l, p)ahl_bhl=nim_product(a_h^a_l, b_h^b_l, p)ah_bh=nim_product(a_h, b_h, p)ah_bh_h=nim_product_power(ah_bh, p-1, p)return ((al_bl^ahl_bhl)<<p)^(al_bl^ah_bh_h)def nim_inv_precalc():for a in range(1<<8, 1<<16):p=8a_h=a>>pa_l=a-(a_h<<p)half_inv=nim_inv_table[nim_product(a_h^a_l, a_l, p)^nim_product_power(nim_square(a_h, p), p-1, p)]nim_inv_table[a]=(nim_product(half_inv, a_h, p)<<p)^nim_product(half_inv, a_h^a_l, p)def nim_inv(a: int, p: int=64) -> int:if p==64:if a<(1<<16):p=16elif a<(1<<32):p=32if p==16:return nim_inv_table[a]p//=2a_h=a>>pa_l=a-(a_h<<p)half_inv=nim_inv(nim_product(a_h^a_l, a_l, p)^nim_product_power(nim_square(a_h, p), p-1, p), p)return (nim_product(half_inv, a_h, p)<<p)^nim_product(half_inv, a_h^a_l, p)def gauss(r: int, c: int, m: list[list[int]], exists: list[int]) -> int:rank=0for i in range(c):if not exists[i]:continuepivot=-1for j in range(rank, r):if m[j][i]>0:pivot=jbreakif pivot==-1:continuem[pivot], m[rank]=m[rank], m[pivot]if rank==r-1:rank+=1breakinv=nim_inv(m[rank][i])m[rank][i]=1for k in range(0, c):if k==i:continuem[rank][k]=nim_product(m[rank][k], inv)for j in range(r):if j==rank:continuefactor=m[j][i]m[j][i]=0for k in range(0, c):if k==i:continuem[j][k]^=nim_product(m[rank][k], factor)rank+=1return ranknim_prod_precalc()nim_inv_precalc()n,t=map(int, input().split())h=[list(map(lambda a: int(a)-1, input().split())) for _ in range(t)]for i in range(t):h[i].reverse()rank=gauss(t, n, h, [1]*n)ranks=[0]*(1<<n)for members_tuple in combinations(range(n), rank):members=list(members_tuple)is_member=[0]*ns=0for i in members:is_member[i]=1s+=1<<iif gauss(rank, n, h, is_member)==rank:ranks[s]=rankfor r in reversed(range(rank)):for members_tuple in combinations(range(n), r):members=list(members_tuple)is_member=[0]*ns=0for i in members:is_member[i]=1s+=1<<ifor i in range(n):if is_member[i]:continueif ranks[s+(1<<i)]>0:ranks[s]=rbreakfor r in range(n):for members_tuple in combinations(range(n), r):members=list(members_tuple)is_member=[0]*ns=0for i in members:is_member[i]=1s+=1<<ifor i in range(n):if is_member[i]:continueranks[s+(1<<i)]=max(ranks[s], ranks[s+(1<<i)])ans=0mods=[1, 932051910, 299560064, 268998206, 169907034, 617122664, 934978948, 751815647, 60241440, 910883406, 623687709, 299771973, 824242875, 286857587, 12424206, 89078497, 595200811, 971438438, 608817788, 778210505, 170380535]MOD=998244353for s in range(1<<n):count=s.bit_count()if n%2>0:if count%2>0:ans+=mods[count-ranks[s]]else:ans-=mods[count-ranks[s]]else:if count%2>0:ans-=mods[count-ranks[s]]else:ans+=mods[count-ranks[s]]ans%=MODprint(ans)