#include #include #include using namespace std; #include #include template struct Matrix{ vector >dat; int N,M;//N x M matrix Matrix(){} Matrix(int N_):Matrix(N_,N_){} Matrix(int N_,int M_):N(N_),M(M_),dat(N_,vector(M_)){} vector&operator[](int i){return dat[i];} const vector&operator[](int i)const{return dat[i];} static Matrix eye(int N) { Matrix res(N); for(int i=0;i>=1)if(n&1)res=res*a; return res; } template Matrix operator+(const U&A)const { Matrix res(N,M); for(int i=0;i Matrix operator-(const U&A)const { Matrix res(N,M); for(int i=0;i Matrix operator*(const U&A)const { Matrix res(N,M); for(int i=0;i>N>>M>>X; for(int i=0;i>U[i]>>V[i]; U[i]--,V[i]--; G[U[i]][V[i]]++; deg[U[i]]++; if(U[i]!=V[i]) { G[V[i]][U[i]]++; deg[V[i]]++; } } if(deg[0]==0) { cout<<1<E(N*N,1); for(int v=0;vA(N*N); for(int v=0;v0) { if(deg[v]==1) { int u=0; while(G[v][u]==0)u++; if(u==v) { A[v*N+v][v*N+v]+=1; } else { A[v*N+v][u*N+v]+=1; A[v*N+u][v*N+v]+=1; } } else { for(int u=0;u0) { int id=u*N+v; for(int w=0;w0) { int jd=v*N+w; if(w!=u) { A[jd][id]+=G[v][w]/mint(deg[v]-1); } else { A[jd][id]+=(G[v][w]-1)/mint(deg[v]-1); } } } } } /* for(int i=0;i