def g(x1,y1,x2,y2)
return x1*y2-y1*x2
end
def lenCheck(x,y)
dx=((x.negative?)?-1:1)*0.0000001
dy=((y.negative?)?-1:1)*0.0000001
add=0
while x*x+y*y<1.0 && add<100
x+=dx
y+=dy
add+=1
end
return [x,y]
end
def searchP(x1,y1,xs,ys,n)
res=0
n.times{|i|
p1=i
p2=(i+1)%n
if 0<=g(xs[p1],ys[p1],-x1,-y1) && 0<=g(-x1,-y1,xs[p2],ys[p2]) then
res=i
break
end
}
return res
end
def calcAllS(xs,ys,n)
ans=0.0
n.times{|i|
x1=xs[i]
y1=ys[i]
x2=xs[(i+1)%n]
y2=ys[(i+1)%n]
ans+=g(x1,y1,x2,y2)
}
return (ans/2.0).abs
end
def calcCross(n,p1,bx,by,xs,ys)
p2=(p1+1)%n
dx=xs[p2]-xs[p1]
dy=ys[p2]-ys[p1]
ax=xs[p1]
ay=ys[p1]
t=(by*ax-bx*ay)/(bx*dy-dx*by)
rx=ax+t*dx
ry=ay+t*dy
return [rx,ry]
end
def calcS(deep,n,p1,r1,r2,xs,ys)
r3=(r1+r2)/2.0
r1a=(r1+r3)/2.0
bx=xs[p1]*(1.0-r1a)+xs[(p1+1)%n]*r1a
by=ys[p1]*(1.0-r1a)+ys[(p1+1)%n]*r1a
p2=searchP(bx,by,xs,ys,n)
ax=xs[p2]
ay=ys[p2]
dx=xs[(p2+1)%n]-xs[p2]
dy=ys[(p2+1)%n]-ys[p2]
xy=calcCross(n,p2,bx,by,xs,ys)
areaXs=[]
areaYs=[]
p1a=[p1,p2].min
p2a=[p1,p2].max
n.times{|i|
if p1a<i && i<=p2a then
areaXs<<xs[i]
areaYs<<ys[i]
end
}
if p1<p2 then
areaXs.unshift(bx)
areaYs.unshift(by)
areaXs<<xy[0]
areaYs<<xy[1]
else
areaXs.unshift(xy[0])
areaYs.unshift(xy[1])
areaXs<<bx
areaYs<<by
end
#p [bx,by,xy[0],xy[1]]
areaS=calcAllS(areaXs,areaYs,areaXs.size)
#p ["s",areaS,areaS*2] if(deep==32)
return areaS
end
def searchB(deep,n,p1,r1,r2,xs,ys,allS)
r3=(r1+r2)/2.0
if 35<deep then
rx0=xs[p1]*(1.0-r3)+xs[(p1+1)%n]*r3
ry0=ys[p1]*(1.0-r3)+ys[(p1+1)%n]*r3
rxy0=lenCheck(rx0,ry0)
rx=rxy0[0]
ry=rxy0[1]
s0=calcS(deep,n,p1,r3,r3,xs,ys)
rd=(allS-s0*2).abs
return [rd,rx,ry]
else
s1=calcS(deep,n,p1,r1,r2,xs,ys)
d1=(s1-(allS-s1)).abs
s2=calcS(deep,n,p1,r2,r1,xs,ys)
d2=(s2-(allS-s2)).abs
if d1<d2 then
return searchB(deep+1,n,p1,r1,r3,xs,ys,allS)
else
return searchB(deep+1,n,p1,r3,r2,xs,ys,allS)
end
end
end
def f(n)
xs=[]
ys=[]
n.times{
x,y=gets.split(" ").map{|e| e.to_f}
xs<<x
ys<<y
}
allS=calcAllS(xs,ys,n)
allAns=[]
n.times{|i|
p1=i
p2=(i+1)%n
allAns<<searchB(0,n,p1,0.0,1.0,xs,ys,allS)
}
e1=allAns.sort![0]
p [allS,e1[0]]
#puts sprintf("%0.15f %0.15f",e1[1],e1[2])
end
n=1
while n>0
n=gets.to_i
break if n==0
f(n)
end
ZGVmIGcoeDEseTEseDIseTIpCglyZXR1cm4geDEqeTIteTEqeDIKZW5kCgpkZWYgbGVuQ2hlY2soeCx5KQoJZHg9KCh4Lm5lZ2F0aXZlPyk/LTE6MSkqMC4wMDAwMDAxCglkeT0oKHkubmVnYXRpdmU/KT8tMToxKSowLjAwMDAwMDEKCWFkZD0wCgl3aGlsZSB4KngreSp5PDEuMCAmJiBhZGQ8MTAwCgkJeCs9ZHgKCQl5Kz1keQoJCWFkZCs9MQoJZW5kCgkKCXJldHVybiBbeCx5XQplbmQKCmRlZiBzZWFyY2hQKHgxLHkxLHhzLHlzLG4pCglyZXM9MAoJbi50aW1lc3t8aXwKCQlwMT1pCgkJcDI9KGkrMSklbgoJCWlmIDA8PWcoeHNbcDFdLHlzW3AxXSwteDEsLXkxKSAmJiAwPD1nKC14MSwteTEseHNbcDJdLHlzW3AyXSkgdGhlbgoJCQlyZXM9aQoJCQlicmVhawkKCQllbmQKCX0KCXJldHVybiByZXMKZW5kCgpkZWYgY2FsY0FsbFMoeHMseXMsbikKCWFucz0wLjAKCW4udGltZXN7fGl8CgkJeDE9eHNbaV0KCQl5MT15c1tpXQoJCXgyPXhzWyhpKzEpJW5dCgkJeTI9eXNbKGkrMSklbl0KCQlhbnMrPWcoeDEseTEseDIseTIpCgl9CglyZXR1cm4gKGFucy8yLjApLmFicwplbmQKCmRlZiBjYWxjQ3Jvc3MobixwMSxieCxieSx4cyx5cykKCXAyPShwMSsxKSVuCglkeD14c1twMl0teHNbcDFdCglkeT15c1twMl0teXNbcDFdCglheD14c1twMV0KCWF5PXlzW3AxXQoJdD0oYnkqYXgtYngqYXkpLyhieCpkeS1keCpieSkKCXJ4PWF4K3QqZHgKCXJ5PWF5K3QqZHkKCXJldHVybiBbcngscnldCmVuZAoKZGVmIGNhbGNTKGRlZXAsbixwMSxyMSxyMix4cyx5cykKCXIzPShyMStyMikvMi4wCglyMWE9KHIxK3IzKS8yLjAKCQoJYng9eHNbcDFdKigxLjAtcjFhKSt4c1socDErMSklbl0qcjFhCglieT15c1twMV0qKDEuMC1yMWEpK3lzWyhwMSsxKSVuXSpyMWEKCXAyPXNlYXJjaFAoYngsYnkseHMseXMsbikKCglheD14c1twMl0KCWF5PXlzW3AyXQoJZHg9eHNbKHAyKzEpJW5dLXhzW3AyXQoJZHk9eXNbKHAyKzEpJW5dLXlzW3AyXQoJeHk9Y2FsY0Nyb3NzKG4scDIsYngsYnkseHMseXMpCglhcmVhWHM9W10KCWFyZWFZcz1bXQoJcDFhPVtwMSxwMl0ubWluCglwMmE9W3AxLHAyXS5tYXgKCQoJbi50aW1lc3t8aXwKCQlpZiBwMWE8aSAmJiBpPD1wMmEgdGhlbgoJCQlhcmVhWHM8PHhzW2ldCgkJCWFyZWFZczw8eXNbaV0KCQllbmQKCX0KCWlmIHAxPHAyIHRoZW4KCQlhcmVhWHMudW5zaGlmdChieCkKCQlhcmVhWXMudW5zaGlmdChieSkKCQlhcmVhWHM8PHh5WzBdCgkJYXJlYVlzPDx4eVsxXQoJZWxzZQoJCWFyZWFYcy51bnNoaWZ0KHh5WzBdKQoJCWFyZWFZcy51bnNoaWZ0KHh5WzFdKQoJCWFyZWFYczw8YngKCQlhcmVhWXM8PGJ5CgllbmQKCgkjcCBbYngsYnkseHlbMF0seHlbMV1dCglhcmVhUz1jYWxjQWxsUyhhcmVhWHMsYXJlYVlzLGFyZWFYcy5zaXplKQoJI3AgWyJzIixhcmVhUyxhcmVhUyoyXSBpZihkZWVwPT0zMikKCXJldHVybiBhcmVhUwplbmQKCmRlZiBzZWFyY2hCKGRlZXAsbixwMSxyMSxyMix4cyx5cyxhbGxTKQoJcjM9KHIxK3IyKS8yLjAKCQoJaWYgMzU8ZGVlcCB0aGVuCgkJcngwPXhzW3AxXSooMS4wLXIzKSt4c1socDErMSklbl0qcjMKCQlyeTA9eXNbcDFdKigxLjAtcjMpK3lzWyhwMSsxKSVuXSpyMwoJCXJ4eTA9bGVuQ2hlY2socngwLHJ5MCkKCQlyeD1yeHkwWzBdCgkJcnk9cnh5MFsxXQoJCXMwPWNhbGNTKGRlZXAsbixwMSxyMyxyMyx4cyx5cykKCQlyZD0oYWxsUy1zMCoyKS5hYnMKCQlyZXR1cm4gW3JkLHJ4LHJ5XQoJZWxzZQoJCXMxPWNhbGNTKGRlZXAsbixwMSxyMSxyMix4cyx5cykKCQlkMT0oczEtKGFsbFMtczEpKS5hYnMKCQlzMj1jYWxjUyhkZWVwLG4scDEscjIscjEseHMseXMpCgkJZDI9KHMyLShhbGxTLXMyKSkuYWJzCgkJaWYgZDE8ZDIgdGhlbgoJCQlyZXR1cm4gc2VhcmNoQihkZWVwKzEsbixwMSxyMSxyMyx4cyx5cyxhbGxTKQoJCWVsc2UKCQkJcmV0dXJuIHNlYXJjaEIoZGVlcCsxLG4scDEscjMscjIseHMseXMsYWxsUykKCQllbmQKCWVuZAplbmQKZGVmIGYobikKCXhzPVtdCgl5cz1bXQoJbi50aW1lc3sKCQl4LHk9Z2V0cy5zcGxpdCgiICIpLm1hcHt8ZXwgZS50b19mfQoJCXhzPDx4CgkJeXM8PHkKCX0KCWFsbFM9Y2FsY0FsbFMoeHMseXMsbikKCWFsbEFucz1bXQoJbi50aW1lc3t8aXwKCQlwMT1pCgkJcDI9KGkrMSklbgoJCWFsbEFuczw8c2VhcmNoQigwLG4scDEsMC4wLDEuMCx4cyx5cyxhbGxTKQoJfQoJZTE9YWxsQW5zLnNvcnQhWzBdCglwIFthbGxTLGUxWzBdXQoJI3B1dHMgc3ByaW50ZigiJTAuMTVmICUwLjE1ZiIsZTFbMV0sZTFbMl0pCmVuZApuPTEKd2hpbGUgbj4wCgluPWdldHMudG9faQoJYnJlYWsgaWYgbj09MAoJZihuKQplbmQ=