#include using namespace std; #define int long long #define rep(i,n) for(int i=0;i<(n);i++) #define pb push_back #define all(v) (v).begin(),(v).end() #define fi first #define se second typedef vectorvint; typedef pairpint; typedef vectorvpint; templateinline void chmin(A &a,B b){if(a>b)a=b;} templateinline void chmax(A &a,B b){if(avec; typedef vectormat; mat I={{1,0},{0,1}}; int mod_pow(int n,int m){ int ret=1; while(m){ if(m&1)ret=ret*n%mod; n=n*n%mod; m>>=1; } return ret; } mat mul(const mat &A,const mat &B){ mat C(A.size(),vec(B[0].size())); for(int i=0;i>=1; } return B; } struct segtree{ static const int SEG=1<<17; vectordat; segtree():dat(SEG*2,I){} void update(int k,mat a){ k+=SEG-1; dat[k]=a; while(k){ k=(k-1)/2; dat[k]=mul(dat[k*2+1],dat[k*2+2]); } } mat query(int a,int b,int k=0,int l=0,int r=SEG){ if(r<=a||b<=l)return I; if(a<=l&&r<=b)return dat[k]; return mul(query(a,b,k*2+1,l,(l+r)/2),query(a,b,k*2+2,(l+r)/2,r)); } }; int N; vint G[111111]; int A[111111],B[111111]; const int SIZE=111111; int par[SIZE],dep[SIZE],hev[SIZE],pos[SIZE],head[SIZE],sz[SIZE]; segtree seg; void dfs(){ vint vs={0}; par[0]=-1; dep[0]=0; rep(i,N){ int v=vs[i]; for(auto u:G[v]){ if(u==par[v])continue; par[u]=v; dep[u]=dep[v]+1; vs.pb(u); } } for(int i=vs.size()-1;i>=0;i--){ int v=vs[i]; sz[v]=1; hev[v]=-1; int ma=0; for(auto u:G[v]){ if(u==par[v])continue; if(ma