Advertisement
_no0B

Untitled

Mar 18th, 2020
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.94 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #include<ext/pb_ds/assoc_container.hpp>
  3. #include<ext/pb_ds/tree_policy.hpp>
  4. #define MAX ((int)1e9 + 5)
  5. #define MAXL ((ll)1e15 + 5)
  6. #define MAX_X ((int)1e5 + 2)
  7. #define pi (2.0*acos(0))
  8. #define M ((int)1e6 + 7)
  9. #define MOD ((int)1e9 + 7)
  10. #define NN ((int)1e5 + 7)
  11. #define N ((int)1e3 + 5)
  12. #define eps (0)
  13. #define fastio ios_base::sync_with_stdio(false),cin.tie(NULL)
  14. #define logn 29
  15. #define endl "\n"
  16. #define mp make_pair
  17. //#define int ll
  18.  
  19.  
  20. using namespace std;
  21. using namespace __gnu_pbds;
  22.  
  23. typedef long long ll;
  24. typedef unsigned long long ull;
  25.  
  26. /*fast io
  27. ios_base::sync_with_stdio(false);
  28. cin.tie(NULL);
  29. */
  30.  
  31.  
  32.  
  33.  
  34. typedef tree < pair < int , pair < int , int > > ,  null_type,  less < pair < int , pair < int , int > > >,  rb_tree_tag,  tree_order_statistics_node_update > o_set;
  35. /// o_set s;
  36. /// s.order_of_key(k) : Number of items strictly smaller than k .
  37. /// *(s.find_by_order(k)) : K-th element in a set (counting from zero).
  38.  
  39.  
  40. int dpp[N/2 + 5][N], dis[2][N] , aux[N/2 + 5][N];
  41.  
  42. vector < int > edg[N];
  43.  
  44. int dia(int n , int par, bool cur)
  45. {
  46.     dis[cur][n] = dis[cur][par] + 1;
  47.     int res = n;
  48.     for(int a:edg[n]){
  49.         if(a!=par){
  50.             int tmp = dia(a,n,cur);
  51.             if(dis[cur][res] < dis[cur][tmp]) res = tmp;
  52.         }
  53.     }
  54.     return res;
  55. }
  56.  
  57. int call(int sum , int n , int par);
  58.  
  59. int help(int sum , int n , int par)
  60. {
  61.     if(sum<1) return 0;
  62.     if(aux[sum][n]!=-1) return aux[sum][n];
  63.     int ans = 1;
  64.     for(int a:edg[n]){
  65.         if(a!=par){
  66.             ans = (ll)ans*call(sum,a,n)%MOD;
  67.         }
  68.     }
  69.     return aux[sum][n] = ans;
  70. }
  71.  
  72. int call(int sum , int n , int par)
  73. {
  74.     if(sum<1) return 0;
  75.     if((par!=0 && edg[n].size()==1) || edg[n].size()==0) return 1;
  76.     if(dpp[sum][n]!=-1) return dpp[sum][n];
  77.     int ans = help(sum-1,n,par) + call(sum-1,n,par);
  78.     if(ans>=MOD) ans -= MOD;
  79.     return dpp[sum][n] = ans;
  80. }
  81.  
  82.  
  83. int main()
  84. {
  85.     fastio;
  86.     int t;
  87.     cin>>t;
  88.  
  89.     for(int tcc = 1 ; tcc<=t ; tcc++){
  90.         int n;
  91.         cin>>n;
  92.  
  93.         ///init
  94.         for(int i = 1; i<=n; i++){
  95.             edg[i].clear();
  96.         }
  97.         ///init
  98.  
  99.         for(int i = 1; i<n; i++){
  100.             int a , b;
  101.             cin>>a>>b;
  102.             edg[b].push_back(a);
  103.             edg[a].push_back(b);
  104.         }
  105.         dis[0][0] = dis[1][0] = -1;
  106.         int dia1 = dia(1,0,0);
  107.         int dia2 = dia(dia1,0,0);
  108.         dia(dia2,0,1);
  109.         int ans = 0 , sum ;
  110.         for(int i = 1; i<=n; i++){
  111.             if(dis[0][i] + dis[1][i] == dis[0][dia2] && abs(dis[0][i] - dis[1][i])<2){
  112.                 memset(dpp,-1,sizeof dpp);
  113.                 memset(aux,-1,sizeof aux);
  114.                 sum = 1 + max(dis[0][i] , dis[1][i]);
  115.                 ans += call(1 + max(dis[0][i],dis[1][i]) , i , 0);
  116.                 if(ans>=MOD) ans -= MOD;
  117.             }
  118.         }
  119.  
  120.         cout<<"Case "<<tcc<<": "<<sum<<" "<<ans<<endl;
  121.  
  122.     }
  123.  
  124.     return 0;
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement