#include <bits/stdc++.h> #define FOR(i, a, b) for (int i=(a); i<(b); i++) #define PPC(x) __builtin_popcount((x)) #define ALL(x) (x).begin(), (x).end() #define pb push_back #define st first #define nd second using namespace std; const int maxN = 26000, mod = 1000000007; inline void addMod(long long& a, long long b) { a = (a + b) % mod; } inline void multMod(long long& a, long long b) { a = a * b % mod; } long long qpow(long long a, long long b) { long long res0 = 1; for (; b!=0; b>>=1) { if (b & 1) multMod(res0, a); multMod(a, a); } return res0; } vector <pair <short, short> > G[maxN]; vector <short> pat; vector <vector <short> > T; //vector <short> T[10000000]; int root; vector <int> inds[2]; int cnt[maxN]; void dfs(int v, int fat) { if (root < v) T.pb(pat); for (auto p : G[v]) { short u, c; tie(u, c) = p; if (u != fat) { pat.pb(c); dfs(u, v); pat.pop_back(); } } } int main() { int n, k; scanf ("%d%d", &n, &k); FOR(i, 1, n) { int a, b, c; scanf ("%d%d%d", &a, &b, &c); G[a].pb({b, c}); G[b].pb({a, c}); } FOR(i, 1, n+1) dfs(root = i, 0); inds[0].resize(T.size()); iota(ALL(inds[0]), 0); FOR(i, 0, T.size()) { sort(ALL(T[i]), greater <short>()); T[i].pb(0); } FOR(d, 0, n-1) { vector <int> &curr = inds[d&1], &nxt = inds[(d&1) ^ 1]; nxt.resize(0); for (int i : curr) cnt[T[i][d]]++; int ile = 0; short dig; FOR(c, 0, n+1) { if (ile + cnt[c] >= k) { dig = c; k -= ile; break; } ile += cnt[c]; } for (int i : curr) { if (T[i][d] == dig) nxt.pb(i); cnt[T[i][d]] = 0; } if (dig == 0) { inds[(n-1)&1] = nxt; break; } } int j = inds[(n-1)&1][0]; vector <short>& t = T[j]; t.pop_back(); long long res = 0; for (short e : t) addMod(res, qpow(n, e)); printf("%lld\n", res); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | #include <bits/stdc++.h> #define FOR(i, a, b) for (int i=(a); i<(b); i++) #define PPC(x) __builtin_popcount((x)) #define ALL(x) (x).begin(), (x).end() #define pb push_back #define st first #define nd second using namespace std; const int maxN = 26000, mod = 1000000007; inline void addMod(long long& a, long long b) { a = (a + b) % mod; } inline void multMod(long long& a, long long b) { a = a * b % mod; } long long qpow(long long a, long long b) { long long res0 = 1; for (; b!=0; b>>=1) { if (b & 1) multMod(res0, a); multMod(a, a); } return res0; } vector <pair <short, short> > G[maxN]; vector <short> pat; vector <vector <short> > T; //vector <short> T[10000000]; int root; vector <int> inds[2]; int cnt[maxN]; void dfs(int v, int fat) { if (root < v) T.pb(pat); for (auto p : G[v]) { short u, c; tie(u, c) = p; if (u != fat) { pat.pb(c); dfs(u, v); pat.pop_back(); } } } int main() { int n, k; scanf ("%d%d", &n, &k); FOR(i, 1, n) { int a, b, c; scanf ("%d%d%d", &a, &b, &c); G[a].pb({b, c}); G[b].pb({a, c}); } FOR(i, 1, n+1) dfs(root = i, 0); inds[0].resize(T.size()); iota(ALL(inds[0]), 0); FOR(i, 0, T.size()) { sort(ALL(T[i]), greater <short>()); T[i].pb(0); } FOR(d, 0, n-1) { vector <int> &curr = inds[d&1], &nxt = inds[(d&1) ^ 1]; nxt.resize(0); for (int i : curr) cnt[T[i][d]]++; int ile = 0; short dig; FOR(c, 0, n+1) { if (ile + cnt[c] >= k) { dig = c; k -= ile; break; } ile += cnt[c]; } for (int i : curr) { if (T[i][d] == dig) nxt.pb(i); cnt[T[i][d]] = 0; } if (dig == 0) { inds[(n-1)&1] = nxt; break; } } int j = inds[(n-1)&1][0]; vector <short>& t = T[j]; t.pop_back(); long long res = 0; for (short e : t) addMod(res, qpow(n, e)); printf("%lld\n", res); return 0; } |