搞了半天是long long的问题,用__int64就A了,貌似在杭电用long long都有问题的
/*
* File: main.cpp
* Author: swordholy
*
* Created on 2011年3月30日, 下午6:50
*/
#include <cstdlib>
#include <deque>
#include <stdio.h>
#include <memory.h>
#include <iostream>
#include <algorithm>
using namespace std;
struct pt
{
__int64 x,y;
__int64 tt;
pt(){}
pt(__int64 xx,__int64 yy)
{
x=xx;
y=yy;
}
};
__int64 llllabs(__int64 x)
{
if (x<0) return -x;
else return x;
}
__int64 Cross(pt a,pt b)
{
return a.x*b.y-a.y*b.x;
}
__int64 Cross(pt a,pt b,pt c)
{
return Cross(pt(a.x-c.x,a.y-c.y),pt(b.x-c.x,b.y-c.y));
}
pt intersection(pt u1,pt u2,pt v1,pt v2)
{
pt ret=u1;
__int64 t=((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x));
__int64 tt=((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x));
ret.x=ret.x*tt+(u2.x-u1.x)*t;
ret.y=ret.y*tt+(u2.y-u1.y)*t;
ret.tt=tt;
return ret;
}
bool same_side(pt p1,pt p2,pt l1,pt l2)//p1或p2落在直线上就算异面
{
__int64 c1=Cross(l1,p1,l2),c2=Cross(l1,p2,l2);
if (c1>0) c1=1;
if (c1<0) c1=-1;
if (c2>0) c2=1;
if (c2<0) c2=-1;
return (c1*c2>0);
}
__int64 gcd(__int64 x,__int64 y)
{
if (y==0)return x;
else return gcd(y,x%y);
}
pt u1,u2,v1,v2;
int main(int argc, char** argv)
{
int tcase,x,y,i,j;
int flag;//-1:uncalc 0:不相交 1:一个交点 2:INF
pt res;
freopen("gxx's_Problem.in","r",stdin);
freopen("gxx's_Problem.SwordHoly.out","w",stdout);
scanf("%d",&tcase);
while(tcase--)
{
scanf("%I64d%I64d%I64d%I64d",&u1.x,&u1.y,&u2.x,&u2.y);
scanf("%I64d%I64d%I64d%I64d",&v1.x,&v1.y,&v2.x,&v2.y);
u1.tt=1;u2.tt=1;v1.tt=1;v2.tt=1;
if (u1.x>u2.x) {pt t=u1;u1=u2;u2=t;}
if (v1.x>v2.x) {pt t=v1;v1=v2;v2=t;}
flag=-1;
//u is a point
if ( (u1.x==u2.x)&&(u1.y==u2.y) )
{
if ((Cross(u1,v1,v2)==0)&&(u1.x>=v1.x)&&(u1.x<=v2.x)&&(u1.y>=min(v1.y,v2.y))&&(u1.y<=max(v2.y,v1.y)) )//第一次这里漏了,没判断y方向的
{
flag=1;
res=u1;
}
else
flag=0;
}
//v is a point
if ( (v1.x==v2.x)&&(v1.y==v2.y) )
{
if ((Cross(v1,u1,u2)==0)&&(v1.x>=u1.x)&&(v1.x<=u2.x)&&(v1.y>=min(u1.y,u2.y))&&(v1.y<=max(u2.y,u1.y)))
{
flag=1;
res=v1;
}
else
flag=0;
}
if (flag==-1)
if ((Cross(u1,v1,v2)==0)&&(Cross(u2,v1,v2)==0) )//在同一直线上
{
if (u1.x!=u2.x)//不垂直
{
if (v1.x==u2.x)
{
flag=1;
res=u2;
}
else if (v1.x>u2.x)
{
flag=0;
}
else
{
if (v2.x==u1.x)
{
flag=1;
res=v2;
}
else if(v2.x<u1.x)
{
flag=0;
}
else
{
flag=2;
}
}
}
else
{
if (u1.y>u2.y) {pt t=u1;u1=u2;u2=t;}
if (v1.y>v2.y) {pt t=v1;v1=v2;v2=t;}
if (v1.y==u2.y)
{
flag=1;
res=u2;
}
else if (v1.y>u2.y)
{
flag=0;
}
else
{
if (v2.y==u1.y)
{
flag=1;
res=v2;
}
else if(v2.y<u1.y)
{
flag=0;
}
else
{
flag=2;
}
}
}
}
else
{
if ( (!same_side(u1,u2,v1,v2))&&(!same_side(v1,v2,u1,u2)) )
{
flag=1;
res=intersection(u1,u2,v1,v2);
}
else flag=0;
}
if (flag==2)
printf("INF/n");
else if(flag==0)
printf("0/n");
else
if (flag==1)
{
printf("1/n");
if (res.tt<0)
{
res.x=-res.x;
res.y=-res.y;
res.tt=-res.tt;
}
__int64 tx,ty;
__int64 k=gcd(llllabs(res.x),res.tt);
res.x=res.x/k;
tx=res.tt/k;
k=gcd(llllabs(res.y),res.tt);
res.y=res.y/k;
ty=res.tt/k;
if (res.x!=0)
{
if (tx!=1)
printf("%I64d/%I64d ",res.x,tx);
else printf("%I64d ",res.x);
}
else printf("0 ");
if (res.y!=0)
{
if (ty!=1)
printf("%I64d/%I64d/n",res.y,ty);
else printf("%I64d/n",res.y);
}
else printf("0/n");
}
}
return 0;
}