結果
問題 | No.1502 Many Simple Additions |
ユーザー |
👑 ![]() |
提出日時 | 2021-05-07 22:31:02 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 340 ms / 2,000 ms |
コード長 | 2,914 bytes |
コンパイル時間 | 362 ms |
コンパイル使用メモリ | 82,252 KB |
実行使用メモリ | 96,376 KB |
最終ジャッジ日時 | 2024-09-15 18:19:27 |
合計ジャッジ時間 | 6,021 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 5 |
other | AC * 39 |
ソースコード
"""まず、連結成分ごとに考えられる奇閉路がある場合、連結成分内が一意に決まるAが全てK以下の場合から、K-1以下の場合を引けばいい全てK以下の場合の数を求めたい"""import sysfrom sys import stdinfrom collections import dequemod = 10**9+7def solve(LIM):state = [0] * Nplus = [0] * Nans = 1for i in range(N):maxx = LIMminx = 1X = Noneif state[i] == 0:nset = set([i])q = deque([i])state[i] = 1while q:v = q.popleft()#xの可能性範囲を狭めるif state[v] == 1: # 1 <= X+plus[v] <= LIMmaxx = min(maxx,LIM-plus[v])minx = max(minx,1-plus[v])else: # 1 <= -X+plus[v] <= LIMmaxx = min(maxx, plus[v]-1)minx = max(minx,plus[v]-LIM)for nex,z in lis[v]:if state[nex] == 0: #新たに定義state[nex] = -1 * state[v]plus[nex] = z - plus[v]q.append(nex)elif state[nex] != state[v]: #別側の場合、整合性チェックif plus[v] + plus[nex] != z:return 0else: #同じ側の場合if X == None: #Xが未定義の場合if state[v] == 1: #2x+plus[v]+plus[nex] = zx2 = z - plus[v] - plus[nex]if x2 % 2 == 1 or x2 <= 0:return 0else:X = x2 // 2else: #-2x + p+p = zx2 = plus[v] + plus[nex] - zif x2 % 2 == 1 or x2 <= 0:return 0else:X = x2 // 2else: #Xが定義済みの場合整合性チェックif state[v] * X + plus[v] + state[nex] * X + plus[nex] != z:return 0#可能性を書けるif X == None:ans *= max(0,maxx-minx+1)elif minx <= X <= maxx:ans *= 1else:ans *= 0ans %= modreturn ansN,M,K = map(int,stdin.readline().split())lis = [ [] for i in range(N)]for i in range(M):X,Y,Z = map(int,stdin.readline().split())X -= 1Y -= 1lis[X].append((Y,Z))lis[Y].append((X,Z))print ((solve(K)-solve(K-1)) % mod)