tjut 4305

来源:互联网 发布:对人工智能的看法作文 编辑:程序博客网 时间:2024/05/29 15:28
#include <iostream>  using namespace std;  #define M 305    struct point{      int x, y;  }p[M];    int C[M][M], G[M][M];  int mod = 10007;    int dis (point a, point b)  {      return (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y);  }    void Egcd (int a, int b, int &x, int &y)  {      if (b == 0)      {          x = 1, y = 0;          return ;      }      Egcd (b, a%b, x, y);      int tp = x;      x = y;      y = tp - a/b*y;  }    int det (int n)    //计算n阶行列式  {      int i, j, k, ans = 1, x, y, flg = 1;      for (i = 0; i < n; i++)      {          if (C[i][i] == 0)          {              for (j = i+1; j < n; j++)                  if (C[j][i])                      break;              if (j == n) return -1;              flg = !flg;              for (k = i; k < n; k++)                  swap (C[i][k], C[j][k]);          }          ans = ans * C[i][i] % mod;          Egcd (C[i][i], mod, x, y);          x = (x%mod + mod) % mod;            //注意保证取余结果为最小非负数          for (k = i+1; k < n; k++)              C[i][k] = C[i][k] * x % mod;          for (j = i+1; j < n; j++)              if (C[j][i] != 0) for (k = i+1; k < n; k++)                  C[j][k] = ((C[j][k] - C[i][k]*C[j][i])%mod + mod) % mod;                  //注意保证取余结果为最小非负数      }      if (flg) return ans;      return mod-ans;  }    int main ()  {      int i, j, k, t, n, r;      scanf ("%d", &t);      while (t--)      {          scanf ("%d%d", &n, &r);          for (i = 0; i < n; i++)              scanf ("%d%d", &p[i].x, &p[i].y);          memset (G, 0, sizeof(G));          for (i = 0; i < n; i++)    //建图          {              for (j = i + 1; j < n; j++)              {                  int tp = dis (p[i], p[j]);                  if (tp > r*r) continue;                  for (k = 0; k < n; k++)                  {                      if (k == i || k == j) continue;                      if ((p[i].x-p[k].x)*(p[j].y-p[k].y) ==                          (p[j].x-p[k].x)*(p[i].y-p[k].y) &&                          dis (p[i], p[k]) < tp && dis (p[j], p[k]) < tp)                          break;                  }                  if (k == n) G[i][j] = G[j][i] = 1;              }          }          memset (C, 0, sizeof(C));          for (i = 0; i < n; i++)              for (j = i + 1; j < n; j++)                  if (G[i][j])                      ++C[i][i], ++C[j][j];          for (i = 0; i < n; i++)              for (j = 0; j < n; j++)              {                  C[i][j] -= G[i][j];                  C[i][j] = (C[i][j]%mod + mod) % mod;                  //注意保证取余结果为最小非负数              }          printf ("%d\n", det(n-1));      }      return 0;  }  

0 0