//想定解法 union-find tree //1.あみだくじを1回だけシミュレートして置換先を決定し、置換先をunion-find treeでまとめ上げる。 // このとき森が出来て、木のそれぞれが一つのループになっている。 //2.それぞれの木の大きさを計算する //3.木の大きさの最小公倍数が答え //n<=100のため最大ケースは232792560 = 16*9*5*7*11*13*17*19となる。多分。オーバーフローはしないはず #include #include #include #include "assert.h" #include #include #include #include using namespace std; #define MAX_N 100 #define MAX_K 1000 class UnionFindTree{ typedef struct { int parent; int rank; }base_node; vector node; public: UnionFindTree(int n){ node.resize(n); for(int i=0; i node[y].rank){ node[y].parent = x; }else{ node[x].rank++; unite(x,y); } } }; 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(); UnionFindTree uft(N); for(int i=0; i forest; for(int i=0; isecond += 1; }else{ forest[parent] = 1; } } int ans = 1; for(auto itr = forest.begin(); itr != forest.end(); itr++){ int val = itr->second; ans = lcm(ans, val); } return ans; } int main(){ int N; cin >> 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