• 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
    ");
    		}
    		else{
    			int ans=work(n);
    			printf("%d
    ",ans);
    		}
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    电商杂谈我对于各类平台的看法及八卦杂谈
    echo的实现
    Autofac依赖注入
    asp.net中获取系统信息
    openlayers 地图事件
    C# Finalize和Dispose的区别
    NET中MSMQ的使用附例子
    图像处理之相似图片识别
    openlayers图片样式替换
    WPF触发器
  • 原文地址:https://www.cnblogs.com/jie-dcai/p/4049833.html
Copyright © 2020-2023  润新知