Submission #1005118

#TimeUsernameProblemLanguageResultExecution timeMemory
1005118AlperenT_Star Trek (CEOI20_startrek)C++17
100 / 100
49 ms28652 KiB
#include <bits/stdc++.h>
 

#pragma GCC optimize("O3,unroll-loops")
#define pb push_back
#define F first
#define S second 
#define all(a) a.begin(),a.end()
#define pii pair <int,int>
#define PII pair<pii , pii>
#define ld long double
#define int long long
#define sz(v) (int)v.size()
#define rep(i , a , b) for(int i=a;i <= b;i++)
#define per(i, a , b) for(int i=a;i >= b;i--)
using namespace std ;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int maxn = 2e5  ,  N = 1e5 +1 , lg = 20 , maxq = 202 , sq = 100   , inf = 1e8 +100 , maxk = 2022 , mod = 1e9 + 7;
int dp[maxn][2] , s[maxn][2] , par[maxn] , ans[maxn] , ted[maxn]  ; 
vector <int> G[maxn] ;

int po(int a, int b){
  if(b==0)return 1 ;
  int v = po(a,b/2) ;
  v =v*v % mod ; 
  if(b&1) v = v*a % mod ;
  return v ;
}

void down(int v, int p =0){
  dp[v][0] = 0;int sum =0 ; 
  for(int u : G[v]){
    if(u == p)continue ;
    down(u , v) ;
    dp[v][0] |= !dp[u][0] ;  
    sum += !dp[u][0 ];
  }
  if(dp[v][0] == 0){
    s[v][0] = 1; 
    for(int u : G[v]){
      if(u == p)continue ;
      s[v][0] += s[u][0] ; 
    }
  }else{
    if(sum==1)
    for(int u : G[v]){
      if(u == p || dp[u][0] == 1)continue ; 
      s[v][0] += s[u][0] ;
    }
  }
} 
void up(int v ,int p=0){
  int t[2] , f[2] ; 
  t[0] = t[1] = f[0] = f[1] =0 ;
  if(p != 0){
    t[dp[v][1]] ++ ;
    f[dp[v][1]] += s[v][1] ;
  }
  for(int u : G[v]){
    if(u == p)continue ;
    t[dp[u][0]]++;
    f[dp[u][0]]+=s[u][0] ; 
  } 
  for(int u : G[v]){
    if(u == p)continue  ;
    t[dp[u][0]]--;
    f[dp[u][0]]-=s[u][0] ;
    if(t[0] == 0){
      dp[u][1] = 0 ;
      s[u][1] = 1 + f[1] ;
    }else{
      dp[u][1] = 1 ; 
      if(t[0] == 1){
        s[u][1] += f[0] ; 
      }
      
    }
    t[dp[u][0]]++;
    f[dp[u][0]]+=s[u][0] ;
  }
  if(t[0] == 0){
    ans[v] = 0 ;
    ted[v] = f[1] + 1  ; 
  }else{
    ans[v] =1 ;
    if(t[0] == 1)ted[v] = f[0] ; 
  }
  for(int u : G[v]){
    if(u ==p)continue ;
    up(u , v) ;  
  }
}
struct mat{
  int a[4][4] , n , m ; 
  mat(){
    rep(i , 0 ,2)rep(j , 0 , 2)a[i][j] = 0 ; 
  }
};;

mat operator* (mat a , mat b){
  mat r ; 
  r.n = b.n ;
  r.m = a.m ;
  rep(i , 0 , r.n-1){
    rep(j , 0 , r.m-1){
      rep(k , 0 , a.n-1){
        r.a[i][j]=  (r.a[i][j] + a.a[k][j] * b.a[i][k]%mod)%mod ;
      }
    }
  }
  return r ; 
}
mat pw(mat a , int d){
  mat ans ;
  rep(i , 0, 1)ans.a[i][i] = 1 ;
  ans.n = ans.m = 2 ;
  while(d){
    if(d&1) ans = ans * a ;
    a = a*a ;
    d/=2; 
  }
  return ans ; 
}

signed main() { 
  ios::sync_with_stdio(false); cin.tie(0);   
  int n , d; cin >> n >> d ;
  rep(i , 1, n-1){
    int v , u ;cin >> v >> u ;
    G[v].pb(u) ;
    G[u].pb(v) ;
  }
  down(1) ;
  up(1) ;
  int t1 = 0  , t2 =0  ,t3 =0 ;  
  rep(i , 1, n){
    if(ans[i] == 0){
      t1 ++ ;
      t3 = (t3 + ted[i])%mod ;
      t2 = (t2 + n-ted[i])%mod ;
   }else{
     t3 = (t3 + n-ted[i])%mod ;
     t2 = (t2 + ted[i])%mod ;
   }
  }
  mat z ;z.n = 2 ; z.m = 2 ;
  z.a[0][1] = n*t1%mod ;
  z.a[0][0] = t2 ;
  //
  z.a[1][1] = n*(n-t1)%mod ;
  z.a[1][0] = t3 ;
  mat a ;a.n = 2 ; a.m = 1 ;
  a.a[0][0] = t1 ;a.a[1][0] = n-t1 ;
  mat x = pw(z , d-1) ;
  a = a*x ;
  int g = ted[1] * a.a[0][0] % mod ;
  if(ans[1] == 1)g = (po(n*n%mod , d) - g + mod)%mod ;
  cout << g << "\n" ;
}
/*

*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...