AtCoder上にある問題のうち、AtCoder Problemsでdiff 1000以上と判定されているものを順番に解いていく企画。
基本的な考え方は全てコード中のコメントに入れてあるので、参照のこと。
出典:
AtCoder Regular Contest 114 B – Special Subsets
数学に慣れていないと、問題を読解するのがまず難しい(え?僕だけ?)。こういう時は、とりあえず入力例をみると分かりやすい。
条件を満たすのはどのような場合か、考察をきちんと行う必要がある。実装時は、閉路の数を数えるのに少しコツが必要かも。
def main():
N = int(input())
func = list(map(int, input().split()))
MOD = 998244353
visited = [-1] * N
loop_n = 0
for start in range(N):
if visited[start] != -1:
continue
now = start
while True:
visited[now] = start
nxt = func[now] - 1
if visited[nxt] == start:
loop_n += 1
break
elif visited[nxt] != -1:
break
else:
now = nxt
print((pow(2, loop_n, MOD) - 1) % MOD)
main()
関連