N = int(input()) A = list(map(int, input().split())) MOD = 1000000007 cnt = [0,0,0] # 現在割り当てられている人数 ans = 1# 現時点での組み合わせ for a in A: idx = [] for i in range(3): if cnt[i] == a: # 割り当て可能 idx.append(i) if len(idx)==0: # 割り当て不能 print(0) exit() cnt[idx[0]]+=1# 任意の色で良いので、一番番号が若い色とする ans *= len(idx) # 割り当て可能な人数をかける ans %= MOD print (ans)
i = 1 K = [] while(1): k = i * (i+1) // 2 if k > 10**5: break K.append(k) i+=1 ifnot N in K: print ('No') exit() print ('Yes') S = [[],[]] i = 0
for n in range(1,N+1): S[i].append(n) S[-1].append(n) i+=1 if n in K: if n==N: break i = 0 S.append([]) print(len(S)) for s in S: print(str(len(s)) + ' ' + ' '.join(map(str,s)))
import sys sys.setrecursionlimit(10**7) dxdy = ((0,1),(0,-1),(1,0),(-1,0)) M = int(input()) N = int(input())
mp = [] mp.append([0]*(M+2)) for n in range(N): line = list(map(int, input().split())) mp.append([0]+line+[0]) mp.append([0]*(M+2))
ans = 0 defdfs(n,m,d): global ans # グローバル変数 if mp[n][m] == 0: return if ans < d: ans = d mp[n][m] = 0 for dx, dy in dxdy: next_n = n + dy next_m = m + dx dfs(next_n, next_m, d+1) mp[n][m] = 1
for n in range(1,N+1): for m in range(1,M+1): dfs(n,m,1) print (ans)
dxdy = ((0,1),(0,-1),(1,0),(-1,0),(-1,1),(1,-1),(1,1),(-1,-1)) ans = [] while(1): W, H = map(int, input().split()) if (W==0and H==0): break mp = [] for h in range(H): line = input() line = line.split() line = [-int(l) for l in line] mp.append(line) defdfs(h,w): mp[h][w] = k for dx, dy in dxdy: nw = w + dx nh = h + dy if (0 <= nh < H and0 <= nw < W): if (mp[nh][nw] == -1): dfs(nh, nw) k = 0 for h in range(H): for w in range(W): if mp[h][w] == -1: k += 1 dfs(h,w) ans.append(k) for a in ans: print(a)
N = int(input()) A = list(map(int, input().split())) INF = 10**18 if0in A: print(0) exit() ans = 1 for a in A: ans*=a if ans > INF: print(-1) exit() print (ans)
N = int(input()) deffactorize(N): n = N r = [] for i in range(2,int(N**0.5)+1): # intに変換すること cnt = 0 while(n%i==0): cnt += 1 n //= i # 整数除算(//)を使うこと if cnt!=0: r.append((i,cnt)) if n!=1: # root(N)以上の素数がある場合 r.append((n,1)) return r
ans = 0 for _, cnt in factorize(N): i = 1 while(i <= cnt): cnt-=i i+=1 ans+=1 print (ans)
N, S = map(int, input().split()) A = list(map(int, input().split())) MOD = 998244353 dp = [[0]*(S+1) for _ in range(N+1)] dp[0][0] = 1 for i in range(N): for s in range(S+1): if s-A[i] >= 0: dp[i+1][s] = (dp[i][s] * 2 + dp[i][s-A[i]]) % MOD else: dp[i+1][s] = dp[i][s] * 2 % MOD # A[i]を集合に加えるかどうかで分岐するので、場合の数は2倍になる print(dp[N][S])
N, M = map(int, input().split()) INF = float('inf') cost = [[INF]*N for _ in range(N)] for n in range(N): cost[n][n] = 0 for m in range(M): a, b, t = map(int, input().split()) cost[a][b] = t
for i in range(N): # 中継点 for j in range(N): # 始点 for k in range(N): # 終点 cost[j][k] = min(cost[j][i]+cost[i][k], cost[j][k])
for n in range(N): if cost[n][n] < 0: print ('NEGATIVE CYCLE') exit()
for c in cost: c = [str(i).replace('inf','INF') for i in c] print(' '.join(c))
from collections import deque dxdy = ((-1,0), (1,0), (0,-1), (0,1)) # タプルやリストで持っておくと便利 H, W, N = map(int,input().split())
maze = []
for h in range(H): s = input() maze.append(s) # 二次元リストにせず、文字列のリストのままでOK
defsolve(sx ,sy, goal): dist = [ [-1]*W for _ in range(H)] dist[sy][sx] = 0 q = deque() q.append((sy,sx)) # スタート地点をenqueue while(q): y, x = q.popleft() if maze[y][x] == goal: # ゴールにたどり着いたら終了 break else: for dx, dy in dxdy: if (0<= x+dx < W) and (0<= y+dy < H) and dist[y+dy][x+dx] == -1and maze[y+dy][x+dx]!='X': # 見訪問かつ通行可能か q.append((y+dy,x+dx)) dist[y+dy][x+dx] = dist[y][x] + 1# 距離を記録 return x,y,dist[y][x]
for i in range(H): for j in range(W): if maze[i][j]=='S': sx = j sy = i ans = 0 for n in range(1,N+1): sx, sy, d = solve(sx, sy, str(n)) ans += d print (ans)