Advertisement
Guest User

Untitled

a guest
Apr 24th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.18 KB | None | 0 0
  1. using ll = long long;
  2. ll mod = 1e9+7;
  3. vector<vector<ll>> m;
  4. ll N;
  5. ll gcdExtended(ll a, ll b, ll *x, ll *y)
  6. {
  7. if (a == 0)
  8. {
  9. *x = 0, *y = 1;
  10. return b;
  11. }
  12.  
  13. ll x1, y1;
  14. ll gcd = gcdExtended(b%a, a, &x1, &y1);
  15.  
  16.  
  17. *x = y1 - (b/a) * x1;
  18. *y = x1;
  19.  
  20. return gcd;
  21. }
  22. ll rev(ll b)
  23. {
  24. ll m = mod;
  25. ll x, y; // used in extended GCD algorithm
  26. ll g = gcdExtended(b, m, &x, &y);
  27.  
  28. // Return -1 if b and m are not co-prime
  29. if (g != 1)
  30. return -1;
  31.  
  32. // m is added to handle negative x
  33. return (x%m + m) % m;
  34. }
  35. void print()
  36. {
  37. for(int i=0; i<N; ++i)
  38. {
  39. string s;
  40. for(int j=0; j<N; ++j)
  41. {
  42. s+=to_string(m[i][j]);
  43. s+=' ';
  44. }
  45. cout<<s<<endl;
  46. }
  47. cout<<endl;
  48. }
  49. ll det_gaus()
  50. {
  51. ll det=1;
  52. for(int i=0; i<N; ++i)
  53. {
  54. if( m[i][i] == 0)
  55. {
  56. for(int k = i + 1; k<N; ++k)
  57. {
  58. if(m[k][i] != 0)
  59. {
  60. swap(m[k], m[i]);
  61. break;
  62. }
  63. }
  64. }
  65. for(int k=i+1; k<N; ++k)
  66. {
  67. if(m[k][i] == 0)
  68. {
  69. continue;
  70. }
  71. ll m1 = m[k][i];
  72. ll m2 = m[i][i];
  73. m1%=mod;
  74. m2%=mod;
  75. det *= rev(m2);
  76. det %= mod;
  77. for(int j=i; j<N; ++j)
  78. {
  79. m[k][j] = m[k][j]*m2 - m[i][j]*m1;
  80. m[k][j]%=mod;
  81. }
  82.  
  83. }
  84. det*=m[i][i];
  85. det%=mod;
  86. }
  87. print();
  88. return det;
  89. }
  90. int hierarchiesCount(int n, std::vector<std::vector<int>> respectList) {
  91. m.resize(n);
  92. for(auto&& v : m)
  93. v.resize(n);
  94. vector<int> d(n);
  95. for(auto& e : respectList)
  96. {
  97. ++d[e[0]];
  98. ++d[e[1]];
  99. m[e[0]][e[1]] = -1;
  100. m[e[1]][e[0]] = -1;
  101.  
  102. }
  103. for(int i=0; i<n; ++i)
  104. {
  105. m[i][i] = d[i];
  106. }
  107. N=n-1;
  108. print();
  109. ll ans = abs(det_gaus())%mod;
  110. ans*=n%mod;
  111. ans%=mod;
  112. return ans;
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement