rendered paste body#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct {
int polaczenia[20];
int stopien;
int odwiedzony;
int lewy, prawy;
int NL, NP;
} punkt;
inline int min(int, int);
void oblicz(punkt *, punkt *);
punkt punkty[100];
int main () {
int t, n, ilosc, ilosc_prev, a, b, max_t;
scanf("%d", &t);
max_t = t;
getchar();
while(t--) {
if (max_t != t+1)
ilosc_prev = ilosc;
scanf("%d", &ilosc);
getchar();
if (max_t == t+1)
ilosc_prev = 0;
for (n=0; n < ilosc+1; n++) { //inicjacja zmiennych
punkty[n].stopien = 0;
punkty[n].odwiedzony = 0;
punkty[n].lewy = punkty[n].prawy = 0;
punkty[n].NL = punkty[n].NP = 1;
}
punkty[0].odwiedzony = 1;
for (n=0; n < ilosc-1; n++) {
scanf("%d %d", &a, &b);
getchar();
punkty[a].polaczenia[punkty[a].stopien] = b;
punkty[b].polaczenia[punkty[b].stopien] = a;
punkty[a].stopien++;
punkty[b].stopien++;
}
oblicz(&punkty[1], 0);
if (punkty[1].lewy > punkty[1].prawy) {
printf("%d %d\n", punkty[1].prawy, (punkty[1].NP > 10007) ? punkty[1].NP%10007 : punkty[1].NP);
} else if (punkty[1].lewy < punkty[1].prawy) {
printf("%d %d\n", punkty[1].lewy, (punkty[1].NL > 10007) ? punkty[1].NL%10007 : punkty[1].NL);
} else {
printf("%d %d\n", punkty[1].lewy, ((punkty[1].NL+punkty[1].NP) > 10007) ? (punkty[1].NL+punkty[1].NP)%10007 : punkty[1].NL+punkty[1].NP);
}
}
return 0;
}
void oblicz(punkt * syn, punkt * rodzic) { //oblicza lewe i prawe wartosci dla podanego punktu
int n, suma;
int * pol;
syn->odwiedzony = 1;
pol = syn->polaczenia;
for (n = 0; n < syn->stopien; n++) {
if (punkty[pol[n]].odwiedzony!=1) {
oblicz(&punkty[pol[n]], syn);
}
}
syn->lewy++;
if (rodzic) {
rodzic->NP*=syn->NL;
if (rodzic->NP > 10007)
rodzic->NP%=10007;
if (syn->lewy > syn->prawy) {
rodzic->NL*=syn->NP;
if (rodzic->NL > 10007)
rodzic->NL%=10007;
} else if (syn->lewy < syn->prawy) {
rodzic->NL*=syn->NL;
if (rodzic->NL > 10007)
rodzic->NL%=10007;
} else {
rodzic->NL*=(syn->NL+syn->NP);
if (rodzic->NL > 10007)
rodzic->NL%=10007;
}
rodzic->prawy += syn->lewy;
rodzic->lewy += min(syn->prawy,syn->lewy);
}
}
inline int min(int a, int b) {
return ((a > b) ? b : a);
}