HDU 4305 Contest 1
感觉是有很多细节要处理的。尤其是求逆元后的运算,应该是存在超范围的情况的。
#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的更多相关文章
- HDU - 4305 - Lightning 生成树计数 + 叉积判断三点共线
HDU - 4305 题意: 比较裸的一道生成树计数问题,构造Krichhoof矩阵,求解行列式即可.但是这道题还有一个限制,就是给定的坐标中,两点连线中不能有其他的点,否则这两点就不能连接.枚举点, ...
- HDU 5045 Contest(状压DP)
Problem Description In the ACM International Collegiate Programming Contest, each team consist of th ...
- hdu - 5045 - Contest(国家压缩dp)
意甲冠军:N个人M通过主打歌有自己的期望,每个问题发送人玩.它不能超过随机播放的次数1,追求最大业绩预期 (1 ≤ N ≤ 10,1 ≤ M ≤ 1000). 主题链接:pid=5045" ...
- [ACM] hdu 5045 Contest (减少国家Dp)
Contest Problem Description In the ACM International Collegiate Programming Contest, each team consi ...
- HDU 4305 Lightning(计算几何,判断点在线段上,生成树计数)
Lightning Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- hdu 4305 生成树计数问题
Lightning Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- HDU–5988-Coding Contest(最小费用最大流变形)
Coding Contest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- 【HDU 4305】Lightning(生成树计数)
Problem Description There are N robots standing on the ground (Don't know why. Don't know how). Sudd ...
- hdu 5045 Contest(状态压缩DP)
题解:我们使用一个二位数组dp[i][j]记录进行到第i个任务时,人组合为j时的最大和(这里的j我们用二进制的每位相应一个人). 详细见代码: #include <iostream> #i ...
随机推荐
- Java 嵌套类和内部类演示样例<三>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-s ...
- JavaWeb应用中的身份验证(声明式)——基于表单的身份认证
容器管理安全最普遍的类型建立在基于表单的身份验证方式上. 通过这样的方式,server自己主动将尚未验证的用户重定向到一个HTML表单.检查他们的username和password,决定他们属于哪个角 ...
- 剑指Offer面试题33(java版):把数组排成最小的数
题目:输入一个正整数数组.把数组里面全部的数字拼接排成一个数,打印能拼接出的全部数字中的一个.比如输入数组{3,32.321}.则打印出这3个数字能排成的最小数字321323. 这个题目最直接的做法应 ...
- 【C语言】编写函数实现字符串旋转
//编写函数实现字符串旋转 #include <stdio.h> #include <assert.h> #include <string.h> void reve ...
- 浅析PHP中cookie与session技术
1.cookie是什么? cookie指某些站点为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密). 通俗来理解就是,你去一个专卖店或者超市买东西,然后店里给你办一张 ...
- kentico7中设置网站的主页
打开SiteManager,选择Settings,然后左上角选择具体的网站,Content,Web Site Content,Default alias path
- ROS安装教程
对于ROS的安装,在它的官方网站: http://wiki.ros.org/ROS/Installation 中也有详细说明.但是对于像博主这样先天英语发育不全的人来说,直接看官网还是有点困难的. 所 ...
- layer最大话.最小化.还原回调方法使用
<head> <meta charset="UTF-8"> <title>layer最大话.最小化.还原回调方法使用</title> ...
- 自定义TempData跨平台思路
一:TempData的自定义实现... TempData是用Session实现的,既然是Session,那模式是线程方式...这样的Session是没法进行跨平台的... 那么这就涉及到如何在多台机器 ...
- 动态修改SeekBar的颜色
方法一 1. 需求:需要改变其默认颜色,样式 2.滑竿样式 seekbar.xml <?xml version="1.0" encoding="utf-8" ...