感觉是有很多细节要处理的。尤其是求逆元后的运算,应该是存在超范围的情况的。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#define MOD 10007
#define N 305
using namespace std; struct point{
int x,y;
}p[N];
int D[N][N],G[N][N],C[N][N];
bool vis[N];
int dist(point a,point b){
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
} void getc(int n){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
C[i][j]=D[i][j]-G[i][j];
}
} bool bfs(int n){
int c=0;
memset(vis,false,sizeof(vis));
queue<int>que;
que.push(1);
vis[1]=true;
while(!que.empty()){
c++;
int tmp=que.front();
que.pop();
for(int i=1;i<=n;i++){
if(G[tmp][i]==1&&!vis[i]){
que.push(i);
vis[i]=true;
}
}
}
if(c==n) return true;
else return false;
} void exgcd (int a, int b, int &x, int &y)
{
if (b == 0)
{
x = 1, y = 0;
return ;
}
exgcd (b, a%b, x, y);
int tp = x;
x = y;
y = tp - a/b*y;
} int work(int n){
int x,y;
int sgn=0;
for(int i=1;i<n;i++)
for(int j=1;j<n;j++)
C[i][j]=(C[i][j]%MOD+MOD)%MOD;
for(int i=1;i<n;i++){
if(C[i][i]==0){
int j;
for(j=i+1;j<n;j++)
if(C[j][i]!=0)
break;
if(j>=n) return -1;
for(int k=1;k<n;k++)
swap(C[i][k],C[j][k]);
sgn++;
}
exgcd(C[i][i],MOD,x,y);
x=(x%MOD+MOD)%MOD;
for(int j=i+1;j<n;j++){
for(int k=i+1;k<n;k++){
C[j][k]=((C[j][k]-(((C[i][k]*x)%MOD)*C[j][i])%MOD)%MOD+MOD)%MOD;
}
}
}
int ans=1;
for(int i=1;i<n;i++)
ans=(ans*(C[i][i]))%MOD;
if(sgn&1)return (MOD-ans)%MOD;
return ans;
} int main(){
int T,n,r;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&r);
for(int i=1;i<=n;i++)
scanf("%d%d",&p[i].x,&p[i].y);
memset(D,0,sizeof(D));
memset(G,0,sizeof(G));
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(i!=j){
int tp=dist(p[i],p[j]);
if(tp<=r*r){
bool flag=true;
for(int k=1;k<=n;k++){
if(k!=i&&k!=j&&dist(p[i],p[k])<=dist(p[i],p[j])&&dist(p[j],p[k])<=tp
&&(p[i].y-p[k].y)*(p[k].x-p[j].x)==(p[k].y-p[j].y)*(p[i].x-p[k].x)){
flag=false;
break;
}
}
if(flag){
D[i][i]++;D[j][j]++;
G[i][j]=G[j][i]=1;
}
}
}
}
}
// for(int i=1;i<=n;i++){
// for(int j=1;j<=n;j++)
// cout<<D[i][j]<<' ';
// cout<<endl;
// }
getc(n);
if(!bfs(n)){
printf("-1\n");
}
else{
int ans=work(n);
printf("%d\n",ans);
}
}
return 0;
}

  

HDU 4305 Contest 1的更多相关文章

  1. HDU - 4305 - Lightning 生成树计数 + 叉积判断三点共线

    HDU - 4305 题意: 比较裸的一道生成树计数问题,构造Krichhoof矩阵,求解行列式即可.但是这道题还有一个限制,就是给定的坐标中,两点连线中不能有其他的点,否则这两点就不能连接.枚举点, ...

  2. HDU 5045 Contest(状压DP)

    Problem Description In the ACM International Collegiate Programming Contest, each team consist of th ...

  3. hdu - 5045 - Contest(国家压缩dp)

    意甲冠军:N个人M通过主打歌有自己的期望,每个问题发送人玩.它不能超过随机播放的次数1,追求最大业绩预期 (1 ≤ N ≤ 10,1 ≤ M ≤ 1000). 主题链接:pid=5045" ...

  4. [ACM] hdu 5045 Contest (减少国家Dp)

    Contest Problem Description In the ACM International Collegiate Programming Contest, each team consi ...

  5. HDU 4305 Lightning(计算几何,判断点在线段上,生成树计数)

    Lightning Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  6. hdu 4305 生成树计数问题

    Lightning Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  7. HDU–5988-Coding Contest(最小费用最大流变形)

    Coding Contest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  8. 【HDU 4305】Lightning(生成树计数)

    Problem Description There are N robots standing on the ground (Don't know why. Don't know how). Sudd ...

  9. hdu 5045 Contest(状态压缩DP)

    题解:我们使用一个二位数组dp[i][j]记录进行到第i个任务时,人组合为j时的最大和(这里的j我们用二进制的每位相应一个人). 详细见代码: #include <iostream> #i ...

随机推荐

  1. [Linux]第二部分-linux文件磁盘格式

    账户信息在/etc/passwd中,密码在/etc/shadow中,组信息在etc/group中 (d/-)rwxrwxrwx 1 root 293 Oct 19 21:24 test 文件属性 连接 ...

  2. Tomcat学习之ClassLoader

    Tomcat学习之ClassLoader 2012-09-04 22:19 8993人阅读 评论(4) 收藏 举报  分类: WEB服务器(13)  版权声明:本文为博主原创文章,未经博主允许不得转载 ...

  3. 【opencv】opencv在vs下的配置(持续更新)

    经常使用配置记录,会更新下去. 1.去掉ipch及.sdf文件 opencv在vs编译会得到很多文件.当中.dsf和ipch文件就有几十M.总是非常占空间,而这都是用来保存C++预编译的头文件和Int ...

  4. UVA 10593 Kites DP

    The season of flying kites is well ahead. So what? Let us make an inventory for kites. We are givena ...

  5. WSL初体验

    Windows10 新增加了WSL子系统, 体验了一下感觉还不错...   开启对应的功能后, 在商店里选择安装Ubuntu就可以了. 迁移文件系统 WSL 的文件系统位于 C 盘,当安装的软件越来越 ...

  6. spring Ioc Aop整合

    之前用DWP项目做spring的IOC,xml总是提示有问题,之后改用maven通过. 之后将这一块的内容补充. 仔细考虑一下spring 的IOC是无处不在的,演示Aop也需要依赖spring的IO ...

  7. Tomcat 初探(一) 简介

    简述 大部分入了 Java 开发这个坑的朋友,都需要把自己的网站发布到 Web 服务器上,相信也听过 Tomcat 的鼎鼎大名.Tomcat 是由 Sun 公司软件架构师詹姆斯·邓肯·戴维森开发的 W ...

  8. Spark RDD概念学习系列之什么是Pair RDD

    不多说,直接上干货! 什么是Pair RDD (1)包含键值对类型的RDD被称作Pair RDD. (2)Pair RDD通常用来进行聚合计算. (3)Pair RDD通常由普通RDD做ETL转换而来 ...

  9. visio中如何取消跨线和去掉页边距

    比较来说,写论文visio和inkscape都不可缺少. 比如visio跨线的问题,已经遇到过两次忘记了.这次截个图作为记录.其实就是在“设计”一栏里,把连接线里面的跨线显示的对勾去掉即可. *** ...

  10. CSS3中的2D和3D转换知识介绍

    一  2D转换 转换是CSS3中具有颠覆性的特征之一,可以实现元素的位移.旋转.变形.缩放,甚至支持矩阵方式,配合即将学习的过渡和动画知识,可以取代大量之前只能靠Flash才可以实现的效果. 1.移动 ...