Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #include<ext/pb_ds/assoc_container.hpp>
- #include<ext/pb_ds/tree_policy.hpp>
- #define MAX ((int)1e9 + 5)
- #define MAXL ((ll)1e15 + 5)
- #define MAX_X ((int)1e5 + 2)
- #define pi (2.0*acos(0))
- #define M ((int)1e6 + 7)
- #define MOD ((int)1e9 + 7)
- #define NN ((int)1e5 + 7)
- #define N ((int)1e3 + 5)
- #define eps (0)
- #define fastio ios_base::sync_with_stdio(false),cin.tie(NULL)
- #define logn 29
- #define endl "\n"
- #define mp make_pair
- //#define int ll
- using namespace std;
- using namespace __gnu_pbds;
- typedef long long ll;
- typedef unsigned long long ull;
- /*fast io
- ios_base::sync_with_stdio(false);
- cin.tie(NULL);
- */
- 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;
- /// o_set s;
- /// s.order_of_key(k) : Number of items strictly smaller than k .
- /// *(s.find_by_order(k)) : K-th element in a set (counting from zero).
- int dpp[N/2 + 5][N], dis[2][N] , aux[N/2 + 5][N];
- vector < int > edg[N];
- int dia(int n , int par, bool cur)
- {
- dis[cur][n] = dis[cur][par] + 1;
- int res = n;
- for(int a:edg[n]){
- if(a!=par){
- int tmp = dia(a,n,cur);
- if(dis[cur][res] < dis[cur][tmp]) res = tmp;
- }
- }
- return res;
- }
- int call(int sum , int n , int par);
- int help(int sum , int n , int par)
- {
- if(sum<1) return 0;
- if(aux[sum][n]!=-1) return aux[sum][n];
- int ans = 1;
- for(int a:edg[n]){
- if(a!=par){
- ans = (ll)ans*call(sum,a,n)%MOD;
- }
- }
- return aux[sum][n] = ans;
- }
- int call(int sum , int n , int par)
- {
- if(sum<1) return 0;
- if((par!=0 && edg[n].size()==1) || edg[n].size()==0) return 1;
- if(dpp[sum][n]!=-1) return dpp[sum][n];
- int ans = help(sum-1,n,par) + call(sum-1,n,par);
- if(ans>=MOD) ans -= MOD;
- return dpp[sum][n] = ans;
- }
- int main()
- {
- fastio;
- int t;
- cin>>t;
- for(int tcc = 1 ; tcc<=t ; tcc++){
- int n;
- cin>>n;
- ///init
- for(int i = 1; i<=n; i++){
- edg[i].clear();
- }
- ///init
- for(int i = 1; i<n; i++){
- int a , b;
- cin>>a>>b;
- edg[b].push_back(a);
- edg[a].push_back(b);
- }
- dis[0][0] = dis[1][0] = -1;
- int dia1 = dia(1,0,0);
- int dia2 = dia(dia1,0,0);
- dia(dia2,0,1);
- int ans = 0 , sum ;
- for(int i = 1; i<=n; i++){
- if(dis[0][i] + dis[1][i] == dis[0][dia2] && abs(dis[0][i] - dis[1][i])<2){
- memset(dpp,-1,sizeof dpp);
- memset(aux,-1,sizeof aux);
- sum = 1 + max(dis[0][i] , dis[1][i]);
- ans += call(1 + max(dis[0][i],dis[1][i]) , i , 0);
- if(ans>=MOD) ans -= MOD;
- }
- }
- cout<<"Case "<<tcc<<": "<<sum<<" "<<ans<<endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement