Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace std;
- void redirect(string filename) {
- freopen((filename + ".out").c_str(), "w", stdout);
- freopen((filename + ".in").c_str(), "r", stdin);
- }
- const int N = 1e5 + 10;
- vector<int> g[N];
- vector<int> t[N];
- int ecount[N];
- void build_tree(int curr, int prev) {
- for (int next: g[curr]) {
- if (next != prev) {
- t[curr].emplace_back(next);
- build_tree(next, curr);
- }
- }
- if (curr != 0) {
- ecount[prev] += ecount[curr] + 1;
- }
- }
- int dvcount[N];
- bool f(int curr, int k) {
- for (int child: t[curr]) {
- if (!f(child, k)) {
- return false;
- }
- }
- for (int child: t[curr]) {
- dvcount[ecount[child] % k]++;
- }
- if (ecount[curr] % k != 0) {
- if (dvcount[(ecount[curr] % k) - 1]) {
- --dvcount[(ecount[curr] % k) - 1];
- } else {
- for (int i: t[curr]) {
- dvcount[ecount[i] % k] = 0;
- }
- return false;
- }
- }
- for (int child: t[curr]) {
- int dv = ecount[child] % k;
- if (dvcount[dv] && dv != k - 1) {
- --dvcount[dv];
- int cdv = k - (ecount[child] % k) - 2;
- if (dvcount[cdv]) {
- --dvcount[cdv];
- } else {
- for (int i: t[curr]) {
- dvcount[ecount[i] % k] = 0;
- }
- return false;
- }
- }
- }
- for (int i: t[curr]) {
- dvcount[ecount[i] % k] = 0;
- }
- return true;
- }
- int main() {
- redirect("deleg");
- ios::sync_with_stdio(false);
- int n;
- cin >> n;
- for (int i = 0; i < n - 1; ++i) {
- int a, b;
- cin >> a >> b;
- --a, --b;
- g[a].emplace_back(b);
- g[b].emplace_back(a);
- }
- build_tree(0, 0);
- for (int k = 1; k < n; ++k) {
- if ((n - 1) % k == 0 && f(0, k)) {
- cout << 1;
- } else {
- cout << 0;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement