a53

arbori_in_graf

a53
Oct 9th, 2019
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.04 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define Roc ios_base::sync_with_stdio(false), cin.tie(NULL)
  3. using namespace std;
  4. int MOD=1000000007;
  5. long long a[51][51];
  6. void gcd(long long &x, long long &y, long long a, long long b)
  7. {
  8. if (!b)
  9. x = 1, y = 0;
  10. else
  11. {
  12. gcd(x, y, b, a % b);
  13. long long aux = x;
  14. x = y;
  15. y = aux - y * (a / b);
  16. }
  17. }
  18.  
  19. long long inverse(long long x)
  20. {
  21. long long ins, inv = 0;
  22. gcd(inv, ins, x, MOD);
  23. if (inv <= 0)
  24. inv = MOD + inv % MOD;
  25. return inv;
  26. }
  27.  
  28. long long determinant(long long a[][51],int n)
  29. {
  30.  
  31. int i, j, k, poz;
  32. int semn=1;
  33.  
  34. for(i=1;i<n;++i)
  35. {
  36.  
  37. if(a[i][i]==0)
  38. {
  39. for(j=i+1,poz=0;j<=n && !poz;++j)
  40. if(a[j][i]!=0)
  41. {
  42. poz=j;
  43. break;
  44. }
  45.  
  46. if(!poz)
  47. return 0;
  48.  
  49. for(j=i;j<=n;++j)
  50. swap(a[i][j],a[poz][j]);
  51. semn*=-1;
  52. }
  53.  
  54. long long p;
  55. for(j=i+1;j<=n;++j)
  56. {
  57. if(a[i][i]<0)
  58. a[i][i]+=MOD;
  59. p=(-a[j][i]*inverse(a[i][i]))%MOD;
  60. if(p<0)
  61. p+=MOD;
  62. for(k=i; k<=n; ++k)
  63. {
  64. a[j][k]=(a[j][k] + p*a[i][k])%MOD;
  65. if(a[j][k]<0)
  66. a[j][k]+=MOD;
  67. }
  68. }
  69. }
  70.  
  71. long long pp=1;
  72. for(i=1;i<=n;++i)
  73. pp=( pp%MOD*a[i][i]%MOD)%MOD;
  74. return pp*semn;
  75. }
  76.  
  77. int main()
  78. {
  79. int n,m;
  80. ifstream f("arbori_in_graf.in");
  81. f>>n>>m;
  82. int x,y;
  83. for(int i=1;i<=m;++i)
  84. f>>x>>y,a[x][y]=-1,a[y][x]=-1,++a[x][x],++a[y][y];
  85. f.close();
  86. long long det=determinant(a,n-1);
  87. ofstream g("arbori_in_graf.out");
  88. g<<(long long int)(det);
  89. g.close();
  90. return 0;
  91. }
Add Comment
Please, Sign In to add comment