[白俊]繰り返し数列2331回
https://www.acmicpc.net/problem/2331
この問題を見ると,dfsを用いて繰返し値を得ると,dfsから抜け出して以前の数を得ることができると考えられる.
リストで実現し,ハッシュで実現したが,dfsを用いなくても実現できる方法がある.
アレイの範囲を設定します.9^5+9^5+9^5+9^5+9^5+9^5=約250000個のプリセット.D[i]=nの形で配列の対応するインデックスの値を変更するには、配列の範囲をあらかじめ決めておく必要があります.
繰り返し文を回して、次のD[i+1]の値を求めます.この値がD配列にある場合はbreak、ない場合はD[i+1]=valueで置き換えます.
D配列にnum値がある場合、その値から値が繰り返されるため、値のインデックスが見つかり、-1の値が正しい.(-1の理由は、D[1]から値の提供を開始したためである.)
上記のような方法で解くこともできます.
dfsを使って問題を解くのも見ました. D配列では,同様に250000個を初期化した. 再帰関数を実現し、D[57]=1、D[74]=2、D[65]=3のようにD[A]=cnt++として現れる. 脱出式はD[A]!=0の場合、すなわち、かつてアクセスしたインデックスが表示された場合、そのcnt値に-1を加算し、dfs()を終了します. D[A]=1を設定したのは、重複数列が最初の値から始まると正解が0になるからです.
この問題を見ると,dfsを用いて繰返し値を得ると,dfsから抜け出して以前の数を得ることができると考えられる.
リストで実現し,ハッシュで実現したが,dfsを用いなくても実現できる方法がある.
私の最初の答え
アレイの範囲を設定します.9^5+9^5+9^5+9^5+9^5+9^5=約250000個のプリセット.D[i]=nの形で配列の対応するインデックスの値を変更するには、配列の範囲をあらかじめ決めておく必要があります.
繰り返し文を回して、次のD[i+1]の値を求めます.この値がD配列にある場合はbreak、ない場合はD[i+1]=valueで置き換えます.
import sys A, P = map(int,sys.stdin.readline().split()) D = [0]*250000 D[1] = A index = 1 while True: num = 0 index += 1 for n in str(D[index-1]): num += (int(n)**P) if num in D: print(D.index(num) - 1) break else: D[index] = num
上記のような方法で解くこともできます.
import sys A, P = map(int,sys.stdin.readline().split()) def repeat(n): num_list = [n] while(True): temp = 0 for i in str(num_list[len(num_list)-1]): temp += int(i)**P if temp in num_list: break else: num_list.append(temp) return num_list.index(temp) print(repeat(A))
私の2番目の答え
dfsを使って問題を解くのも見ました.
import sys sys.setrecursionlimit(10000) A, P = map(int,sys.stdin.readline().split()) D = [0]*250000 D[A] = 1 def dfs(A, cnt): num = 0 for n in str(A): num += (int(n)**P) if D[num] != 0: print(D[num]-1) return else: cnt += 1 D[num] = cnt dfs(num, cnt) dfs(A, D[A])
Reference
この問題について([白俊]繰り返し数列2331回), 我々は、より多くの情報をここで見つけました https://velog.io/@sloools/백준-2331번-반복수열テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol