hdu 5738 Eureka
Eureka
Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2924 Accepted Submission(s): 816
Problem Description
Professor Zhang draws n points on the plane, which are conveniently labeled by 1,2,...,n. The i-th point is at (xi,yi). Professor Zhang wants to know the number of best sets. As the value could be very large, print it modulo 109+7.
A set P (P contains the label of the points) is called best set if and only if there are at least one best pair in P. Two numbers u and v (u,v∈P,u≠v) are called best pair, if for every w∈P, f(u,v)≥g(u,v,w), where f(u,v)=(xu−xv)2+(yu−yv)2−−−−−−−−−−−−−−−−−−√ and g(u,v,w)=f(u,v)+f(v,w)+f(w,u)2.
A set P (P contains the label of the points) is called best set if and only if there are at least one best pair in P. Two numbers u and v (u,v∈P,u≠v) are called best pair, if for every w∈P, f(u,v)≥g(u,v,w), where f(u,v)=(xu−xv)2+(yu−yv)2−−−−−−−−−−−−−−−−−−√ and g(u,v,w)=f(u,v)+f(v,w)+f(w,u)2.
Input
There are multiple test cases. The first line of input contains an integer T, indicating the number of test cases. For each test case:
The first line contains an integer n (1≤n≤1000) -- then number of points.
Each of the following n lines contains two integers xi and yi (−109≤xi,yi≤109) -- coordinates of the i-th point.
The first line contains an integer n (1≤n≤1000) -- then number of points.
Each of the following n lines contains two integers xi and yi (−109≤xi,yi≤109) -- coordinates of the i-th point.
Output
For each test case, output an integer denoting the answer.
Sample Input
3
3
1 1
1 1
1 1
3
0 0
0 1
1 0
1
0 0
Sample Output
4
3
0
/* hdu 5738 Eureka problem: 求有多少个队列,满足 f(u,v) >= g(u,v,m) solve: f(u,v) >= g(u,v,m) ----> f(u,v) >= f(u,w) + f(w,v); f()即求两点间的距离 所以就成了找出有多少点共线. 然后计算对best sets贡献即可. hhh-2016-08-26 19:08:41 */ #pragma comment(linker,"/STACK:124000000,124000000") #include <algorithm> #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <vector> #include <math.h> #include <queue> #include <map> #define lson i<<1 #define rson i<<1|1 #define ll long long #define clr(a,b) memset(a,b,sizeof(a)) #define scanfi(a) scanf("%d",&a) #define scanfl(a) scanf("%I64d",&a) #define key_val ch[ch[root][1]][0] #define inf 0x3f3f3f3f using namespace std; const ll mod = 1e9+7; const int maxn = 1004; ll gcd(ll a,ll b) { if(!a) return b; if(!b) return a; while(a % b != 0) { ll t = a% b; a = b; b = t; } return b; } struct node { ll x,y; } pnode[maxn]; bool cmp(node a,node b) { if(a.x != b.x) return a.x < b.x; return a.y < b.y; } map<pair<ll,ll>,int> mp; ll pow_mod(ll a,ll n) { ll cnt = 1; if(n < 0) return 0; while(n) { if(n & 1) cnt = cnt*a%mod; a = a*a%mod; n >>= 1; } return cnt; } int main() { // freopen("in.txt","r",stdin); int T,n; ll v,u; scanfi(T); while(T--) { scanfi(n); for(int i = 0; i < n; i++) { scanfl(u),scanfl(v); pnode[i].x = u,pnode[i].y = v; } ll ans = 0; sort(pnode,pnode+n,cmp); for(int i =0; i < n; i++) { ll cnt = 0; mp.clear(); for(int j = i+1; j < n; j++) { if(pnode[i].x == pnode[j].x && pnode[i].y == pnode[j].y) cnt++; else { ll tx = pnode[i].x - pnode[j].x; ll ty = pnode[i].y - pnode[j].y; ll t = gcd(tx,ty); if(t) mp[make_pair(tx/t,ty/t)]++; else mp[make_pair(tx,ty)]++; } } if(cnt ) { ans = (ans+pow_mod(2,cnt)-1)%mod; } for(map<pair<ll,ll>,int>::iterator it = mp.begin();it != mp.end();it++) { ll num = (ll)(it->second); ans = (ans+pow_mod(2,cnt)*(pow_mod(2,num)-1)%mod)%mod; } } printf("%I64d\n",ans); } return 0; }