Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using ll = long long;
- ll mod = 1e9+7;
- vector<vector<ll>> m;
- ll N;
- ll gcdExtended(ll a, ll b, ll *x, ll *y)
- {
- if (a == 0)
- {
- *x = 0, *y = 1;
- return b;
- }
- ll x1, y1;
- ll gcd = gcdExtended(b%a, a, &x1, &y1);
- *x = y1 - (b/a) * x1;
- *y = x1;
- return gcd;
- }
- ll rev(ll b)
- {
- ll m = mod;
- ll x, y; // used in extended GCD algorithm
- ll g = gcdExtended(b, m, &x, &y);
- // Return -1 if b and m are not co-prime
- if (g != 1)
- return -1;
- // m is added to handle negative x
- return (x%m + m) % m;
- }
- void print()
- {
- for(int i=0; i<N; ++i)
- {
- string s;
- for(int j=0; j<N; ++j)
- {
- s+=to_string(m[i][j]);
- s+=' ';
- }
- cout<<s<<endl;
- }
- cout<<endl;
- }
- ll det_gaus()
- {
- ll det=1;
- for(int i=0; i<N; ++i)
- {
- if( m[i][i] == 0)
- {
- for(int k = i + 1; k<N; ++k)
- {
- if(m[k][i] != 0)
- {
- swap(m[k], m[i]);
- break;
- }
- }
- }
- for(int k=i+1; k<N; ++k)
- {
- if(m[k][i] == 0)
- {
- continue;
- }
- ll m1 = m[k][i];
- ll m2 = m[i][i];
- m1%=mod;
- m2%=mod;
- det *= rev(m2);
- det %= mod;
- for(int j=i; j<N; ++j)
- {
- m[k][j] = m[k][j]*m2 - m[i][j]*m1;
- m[k][j]%=mod;
- }
- }
- det*=m[i][i];
- det%=mod;
- }
- print();
- return det;
- }
- int hierarchiesCount(int n, std::vector<std::vector<int>> respectList) {
- m.resize(n);
- for(auto&& v : m)
- v.resize(n);
- vector<int> d(n);
- for(auto& e : respectList)
- {
- ++d[e[0]];
- ++d[e[1]];
- m[e[0]][e[1]] = -1;
- m[e[1]][e[0]] = -1;
- }
- for(int i=0; i<n; ++i)
- {
- m[i][i] = d[i];
- }
- N=n-1;
- print();
- ll ans = abs(det_gaus())%mod;
- ans*=n%mod;
- ans%=mod;
- return ans;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement