//想定解法 ループを回す //1.あみだくじを1回シミュレートして置換先を決定する。 //2.実際にループをn回回して列の一部がもとに戻るために必要な置換の最小回数を検出する。 // たとえば、列の1番目が1->4->3->2->1となったとき、列の1番目は長さ4の巡回置換に属している。 //3.列のそれぞれの要素が属している巡回置換の長さの最小公倍数が答え。 // 計算量はO(n^2 + k)。頑張れば削れそう #include #include #include #include "assert.h" #include #include #include #include using namespace std; #define MAX_N 100 #define MAX_K 1000 long long gcd(long long a, long long b){ if(b==0) return a; return gcd(b, a%b); } long long lcm(long long a, long long b){ if(a &v){ int n = v.size(); vector pos(n); vector next(n); for(int i=0; i sub_loop(n, n+100); //実際にn回置換を行う //巡回置換の長さは最大でnなのでn回回せば十分 for(int i=0; i> N; assert(2<=N && N<=MAX_N); int K; cin >> K; assert(0<=K && K<=MAX_K); vector v(N); for(int i=0; i> x >> y; assert(1<=x && x<= N); assert(1<=y && y<= N); assert(x