hdu 5738

#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <math.h>
#include <iostream>
#define ll long long
#define mod 1000000007
using namespace std;
int n,maxx;
double s[10005];
struct line
{
    ll x,y;
} a[10005];
bool cmp(line a,line b)
{
    return a.x<b.x;
}

ll pw[10100];
void init()
{
    pw[0]=1;
    for (int i=1;i<=10000;i++)
        pw[i]=2*pw[i-1] % mod;

}

int main()
{
    long long res;
    int T;
    init();
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        res=0;
        for(int i=1; i<=n; i++)
            scanf("%lld%lld",&a[i].x,&a[i].y);
        sort(a+1,a+1+n,cmp);
        for(int i=1; i<n; i++)
        {
            int tot=1,ans=0;
            int c=0;
            for(int j=i+1; j<=n; j++)
            {
                if (a[i].x==a[j].x && a[i].y == a[j].y) c++;
                else
                {
                if (a[i].x==a[j].x) s[tot++]=1e9+7;
                else
                    s[tot++]=(1.0*a[j].y-1.0*a[i].y)/(1.0*a[j].x-1.0*a[i].x);
                }
            }
            ll cnum=0;
            sort(s+1,s+tot);
            for(int i=1; i<tot-1; i++)
                if(fabs(s[i+1]-s[i])<1e-12)
                    ans++;
                else
                {
                    //res+= (1LL<<(ans+1+c)) -1;
                    res+= pw[ans+1+c] -1 + mod ;
                    res%=mod;
                    ans=0;
                    cnum++;
                }
            if (tot>1)
            {
                //res+= (1LL<<(ans+1+c)) -1;
                    res+= pw[ans+1+c] -1 + mod ;
                    res%=mod;
                    cnum++;
                    res-=(cnum-1)*(pw[c] -1 );
                   res%=mod;
            }
            if (tot==1)
            {
                //res+= (1LL<<c) -1 ;
                res+=pw[c] - 1 + mod ;
                res %= mod;
            }
        }
        printf("%lld\n",res);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章