#include #include #include using namespace std; 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 x, vector y){ int N = x.size(); bool valid = true; //前処理 //gcd(Yi,Yj) == 1 (i!=j) でなくてはならないので、 //共通の因数 g = gcd(Yi,Yj) を見つけたら片側に寄せてしまう for(int i=0; i z(N); for(int i=0; i get_order(int n, vector& v){ vector a(n), b(n, 114514); iota(a.begin(), a.end(), 0); for(int i=0; i> n >> k; vector v(n); iota(v.begin(), v.end(), 0); for(int i=0; i> x >> y; x--; y--; swap(v[x], v[y]); } vector orders = get_order(n, v); long long M = 1; //vの位数 for(int i=0; i> q; while(q--){ vector w(n); for(int i=0; i> w[i]; w[i]--; } vector a(n), b(n, 114514); iota(a.begin(), a.end(), 0); for(int i=0; i x, y; bool valid = true; vector visit(n, false); for(int i=0; i