HDU5738 2016 Multi-University Training Contest 2 (组合数学+极角排序)

来源:互联网 发布:mac office2016机锋 编辑:程序博客网 时间:2024/04/28 15:04
#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<algorithm>using namespace std;struct node{    int x,y;    long double ang;}pot[1005],tmp[1005];bool cmp(node a,node b){    if(a.x==b.x)        return a.y<b.y;    return a.x<b.x;}bool comp(node a,node b){    return a.ang<b.ang;}const int mod=1e9+7;const long double eps=1e-12;long long e[1005]={1};void init(){    for(int i=1;i<1005;i++)        e[i]=e[i-1]*2%mod;}int main(){    //freopen("1005.in","r",stdin);    //freopen("1005outt.txt","w",stdout);    int t,n,i,j;    long long res,ans;    init();    scanf("%d",&t);    while(t--&&scanf("%d",&n)!=EOF)    {        memset(pot,0,sizeof(pot));        memset(tmp,0,sizeof(tmp));        for(i=0;i<n;i++)            scanf("%d%d",&pot[i].x,&pot[i].y);        sort(pot,pot+n,cmp);        for(i=0,ans=0,res=0;i<n-1;i++)        {            int sx=pot[i].x,sy=pot[i].y,sum=0,cnt=0,num=0,d=0;            for(j=i+1;j<n;j++)            {                if((sx==pot[j].x)&&(sy==pot[j].y))                {                    sum++;                    continue;                }                tmp[cnt]=pot[j];                tmp[cnt++].ang=atan2((long double)(pot[j].y-sy),(long double)(pot[j].x-sx));            }            sort(tmp,tmp+cnt,comp);            for(int i=0;i<cnt;)            {                num=sum+1;                int j;                for(j=i+1;j<cnt;j++)                {                    if(fabs(tmp[j].ang-tmp[i].ang)>eps)                        break;                    num++;                }                i=j;                ans=(ans+e[num]-1)%mod;                d++;            }            ans=(ans-(long long)((d-1)*(e[sum]-1+mod))%mod+mod)%mod;        }        printf("%lld\n",ans);    }    return 0;}

0 0
原创粉丝点击