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> // Common file
- #include <ext/pb_ds/tree_policy.hpp> // Including tree_order_statistics_node_update
- #define ff first
- #define ss second
- #define pb push_back
- #define pf push_front
- #define eb emplace_back
- #define emp emplace
- #define ins insert
- #define mp make_pair
- #define mt make_tuple
- #define sz(s) (int)s.size()
- #define forp(i,a,b) for( int i=a;i<=b;i++)
- #define rep(i,n) for( int i=0;i<n;i++)
- #define ren(i,n) for( int i=n-1;i>=0;i--)
- #define forn(i,a,b) for( int i=a;i>=b;i--)
- #define w(t) while(t)
- #define on cout<<"\n"
- #define os cout <<" "
- #define o2(a,b) cout<<a<<" "<<b
- #define o(a) cout << a
- #define bitcount __builtin_popcount
- #define gcd __gcd
- #define all(v) v.begin(),v.end()
- #define mem(n,m) memset(n,m,sizeof(n))
- #define pii pair<int,int>
- #define tiii tuple<int, int, int>
- #define pll pair<long long,long long>
- #define sii set<int>
- #define sll set<long long>
- #define vii vector<int>
- #define vll vector<long long>
- #define mii map<int,int>
- #define mll map<long long, long long>
- #define lob lower_bound
- #define upb upper_bound
- #define ret return
- #define present(s,x) (s.find(x) != s.end())
- #define cpresent(s,x) (find(all(s),x) != s.end())
- #define ford(container, it) for(auto it = container.begin(); it != container.end(); it++)
- #define fors(container, it, a, b) for(auto it = a; it != b; it++)
- using namespace __gnu_pbds;
- #define boost ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
- #define MOD 1000000007
- #define EPSILON 1e-9
- #define PI acos(-1)
- #define inf 1e18
- #define siz 100005
- #define SIZ 1000005
- #define SIZE 200005
- #define int long long
- #define debug(a) cerr<<#a<<": ";for(auto i:a)cerr<<i<<" ";cerr<<'\n';
- #define trace(a) cerr<<#a<<": "<<a<<"\n"
- #define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
- typedef long long ll;
- typedef long double ldo;
- typedef double db ;
- using namespace std;
- auto start = std::chrono::system_clock::now();
- inline void skj()
- {
- std::chrono::time_point<std::chrono::system_clock> end;
- end = std::chrono::system_clock::now();
- std::chrono::duration<double> elapsed_seconds = end - start;
- std::time_t end_time = std::chrono::system_clock::to_time_t(end);
- cerr<<"Time taken " << elapsed_seconds.count()*1000<<"\n";
- }
- mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
- //uniform_int_distribution<int> ud(1, 100); use this for random number generator
- //custom hash for unordered map
- struct custom_hash {
- static uint64_t splitmix64(uint64_t x) {
- // http://xorshift.di.unimi.it/splitmix64.c
- x += 0x9e3779b97f4a7c15;
- x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
- x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
- return x ^ (x >> 31);
- }
- size_t operator()(uint64_t x) const {
- static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
- return splitmix64(x + FIXED_RANDOM);
- }
- };
- inline int binexp(int a,int b,int m)
- {
- int res=1;
- a%=m;
- while(b)
- {
- if(b&1)
- res=(res*1ll*a)%m;
- a=(a*1ll*a)%m;
- b>>=1;
- }
- return res;
- }
- int lp[siz];
- inline void seive() {
- forp(i, 2, siz - 1) {
- if(lp[i] == 0) {
- for(int j = i; j < siz; j += i) {
- if(lp[j] == 0) {
- lp[j] = i;
- }
- }
- }
- }
- }
- int n, par[siz], rnk[siz];
- inline void init(int n) {
- forp(i, 1, n) {
- par[i] = i;
- rnk[i] = 1;
- }
- }
- inline int find(int a) {
- ret a == par[a] ? a : par[a] = find(par[a]);
- }
- inline void Union(int a, int b) {
- a = find(a), b = find(b);
- if(rnk[a] > rnk[b]) {
- swap(a, b);
- }
- rnk[b] += rnk[a];
- par[a] = b;
- }
- inline void comb(int a, int b, mii &M) {
- w(a > 1) {
- int p = lp[a], c = 0;
- w(a % p == 0) {
- c++, a /= p;
- }
- M[p] += b * c;
- }
- }
- mii M, m;
- inline int doit(vector<pair<int, pii>> &edges, mii &M) {
- init(n);
- int p = 1;
- for(auto &it : edges) {
- int u = it.ss.ff, v = it.ss.ss;
- u = find(u), v = find(v);
- comb(it.ff, rnk[u] * rnk[v], M);
- p = (p * binexp(it.ff, rnk[u] * rnk[v], MOD)) % MOD;
- Union(u, v);
- }
- ret p;
- }
- inline void solve_me_senpai() {
- cin >> n;
- assert(1 <= n && n <= 1e5);
- vector<pair<int, pii>> edges;
- rep(i, n - 1) {
- int u, v, w;
- cin >> u >> v >> w;
- assert(1 <= u && u <= n);
- assert(1 <= v && v <= n);
- assert(1 <= w && w <= 1e5);
- edges.pb({w, {u, v}});
- }
- sort(all(edges));
- int p = doit(edges, M);
- sort(all(edges), greater<pair<int, pii>>());
- int q = doit(edges, m);
- int res = inf;
- for(auto i : m) {
- res = min(res, M[i.ff] / m[i.ff]);
- }
- o(p);on;
- o(q);on;
- o(res);on;
- }
- signed main()
- {
- boost
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r",stdin);
- freopen("ot.txt", "w", stdout);
- #endif
- seive();
- int t = 1;
- //cin >> t;
- //int a = 1;
- while(t--) {
- // cout << "Case #" << a << ": ";
- solve_me_senpai();
- //a++;
- }
- skj();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement