SRM652 Div1E: ThePermutationGame
問題
ボブが1からNまでの自然数を並び替えて数列pを作る(ここではpは1-indexedとしておく)。アリスはf(1)=p[1]、f(m)=p[f(m-1)]となるようにfを考える。ボブがどのように数列pを作ってもf(x)=1となるような最小のxを求めよ。
解法
ボブがどんな数列を作ってもf(q)=1となるqが存在し、f(q+1)=p[f(q)]=p[1]=f(1)となるので、fは必ず周期がある数列になる。この周期の最小公倍数が求めるxとなる。周期はN以下の自然数全てについて考えられるので、要するにN以下の自然数全ての最小公倍数を求めればいい。
コード
import java.util.ArrayList; public class ThePermutationGame { public int findMin(int N) { int INF = 1000000007; ArrayList<Integer> list = new ArrayList<>(); list.add(2); for (int i = 1; 2 * i + 1 <= N; i++) { int n = 2 * i + 1; boolean prime = true; for (Integer integer : list) { if (n % integer == 0) { prime = false; break; } } if (prime) { list.add(n); } } long ans = 1; for (Integer num : list) { long p = num; while (p <= N) { p *= num; } p /= num; ans *= p; ans %= INF; } return (int) ans; } }