#include<bits/stdc++.h>
using namespace std;
#define MX 20050
#define EPS 1e-9
struct info{
double x,y;
}arr[MX+5];
double distance(double x1, double y1, double x2, double y2) {
double value;
value = (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2);
value = sqrt(value);
return value;
}
double lineLineIntersection(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4, double &x, double &y) {
//First line x1,y1 and x2,y2
//second line x3,y3 and x4,y4
//lines formation
//line A1x+B1y+C1=0; (y1-y2)*x + (x2-x1)*y+ x1*y2-x2*y1=0
double A1 = y1-y2;
double B1 = x2-x1;
double C1 = x1 * y2 - x2 * y1;
C1 = -C1;
//line A2x+B2y+C2 = 0; (y3-y4)*x+(x4-x3)*y+x3*y4-x4*y3 = 0;
double A2 = y3-y4;
double B2 = x4-x3;
double C2 = x3 * y4 - x4 * y3;
C2 = -C2;
//line intersection point find through intersection
double hor = A1*B2 - A2 * B1; // common hor
//finding x
x = (C1*B2 - B1 * C2)/hor;
//finding y
y = (A1 * C2 - A2 * C1)/hor;
}
bool validityCheck(double x1, double y1, double x2, double y2, double x, double y) {
if(x1>=x1 && x1<=x2 && y >= y1 && y <= y2) return true;
return false;
}
bool lineFormation(double x1, double y1, double x2, double y2, double &A, double &B,double &C){
A = y1-y2;
B = x2-x1;
C = x1 * y2 - x2 * y1; //Ax+By+C=0
}
double setOnLine(double A,double B, double C, double x, double y) {
double value = A * x + B * y + C;
return value;
}
double RockyMountains(int n, double ax) {
double sum = 0.0;
double px=arr[1].x,py = arr[1].y;
double cx = arr[1].x;
double cy= arr[1].y;
for(int i=2;i<=n;i++) {
double A,B,C;
lineFormation(cx,cy,ax,0,A,B,C);
double value = setOnLine(A,B,C,arr[i].x,arr[i].y);
if(value<0){
double x,y;
lineLineIntersection(cx,cy,ax,0,arr[i-1].x,arr[i-1].y,arr[i].x,arr[i].y,x,y);
sum += distance(x,y,arr[i].x,arr[i].y);
cx = arr[i].x;
cy = arr[i].y;
}
else if(value == 0) {
cx=arr[i].x;
cy=arr[i].y;
}
else {
continue;
}
}
return sum;
}
int main()
{
int T,t;
scanf("%d",&T);
for(t = 1; t <= T; t++) {
int n;
double ax;
scanf("%d %lf",&n,&ax);
for(int i=1;i<=n;i++) {
scanf("%lf %lf",&arr[i].x,&arr[i].y);
}
double ans = RockyMountains(n,ax);
printf("Case %d: %0.10lf\n",t, ans);
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBNWCAyMDA1MAojZGVmaW5lIEVQUyAxZS05CgpzdHJ1Y3QgaW5mb3sKCgkgZG91YmxlIHgseTsKfWFycltNWCs1XTsKCmRvdWJsZSBkaXN0YW5jZShkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIpIHsKICBkb3VibGUgdmFsdWU7CiAgdmFsdWUgPSAoeDEteDIpKih4MS14MikgKyAoeTEteTIpKih5MS15Mik7CiAgdmFsdWUgPSBzcXJ0KHZhbHVlKTsKICByZXR1cm4gdmFsdWU7Cn0KCmRvdWJsZSBsaW5lTGluZUludGVyc2VjdGlvbihkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIsIGRvdWJsZSB4MywgZG91YmxlIHkzLCBkb3VibGUgeDQsIGRvdWJsZSB5NCwgZG91YmxlICZ4LCBkb3VibGUgJnkpIHsKCgkgLy9GaXJzdCBsaW5lIHgxLHkxIGFuZCB4Mix5MgoJIC8vc2Vjb25kIGxpbmUgeDMseTMgYW5kIHg0LHk0CgoJIC8vbGluZXMgZm9ybWF0aW9uCgkgLy9saW5lIEExeCtCMXkrQzE9MDsgKHkxLXkyKSp4ICsgKHgyLXgxKSp5KyB4MSp5Mi14Mip5MT0wCgkgZG91YmxlIEExID0geTEteTI7CgkgZG91YmxlIEIxID0geDIteDE7CgkgZG91YmxlIEMxID0geDEgKiB5MiAtIHgyICogeTE7CgkgQzEgPSAtQzE7CgoJIC8vbGluZSBBMngrQjJ5K0MyID0gMDsgKHkzLXk0KSp4Kyh4NC14MykqeSt4Myp5NC14NCp5MyA9IDA7CgkgZG91YmxlIEEyID0geTMteTQ7CgkgZG91YmxlIEIyID0geDQteDM7CgkgZG91YmxlIEMyID0geDMgKiB5NCAtIHg0ICogeTM7CgkgQzIgPSAtQzI7CgoJIC8vbGluZSBpbnRlcnNlY3Rpb24gcG9pbnQgZmluZCB0aHJvdWdoIGludGVyc2VjdGlvbgoJIGRvdWJsZSBob3IgPSBBMSpCMiAtIEEyICogQjE7IC8vIGNvbW1vbiBob3IKCSAvL2ZpbmRpbmcgeAoJIHggPSAoQzEqQjIgLSBCMSAqIEMyKS9ob3I7CgkgLy9maW5kaW5nIHkKCSB5ID0gKEExICogQzIgLSBBMiAqIEMxKS9ob3I7Cn0KCmJvb2wgdmFsaWRpdHlDaGVjayhkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIsIGRvdWJsZSB4LCBkb3VibGUgeSkgewogIAkgaWYoeDE+PXgxICYmIHgxPD14MiAmJiB5ID49IHkxICYmIHkgPD0geTIpIHJldHVybiB0cnVlOwogIAkgcmV0dXJuIGZhbHNlOwp9Cgpib29sIGxpbmVGb3JtYXRpb24oZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSB4MiwgZG91YmxlIHkyLCBkb3VibGUgJkEsIGRvdWJsZSAmQixkb3VibGUgJkMpewogICAgICBBID0geTEteTI7CgkgIEIgPSB4Mi14MTsKICAgICAgQyA9IHgxICogeTIgLSB4MiAqIHkxOyAvL0F4K0J5K0M9MAp9Cgpkb3VibGUgc2V0T25MaW5lKGRvdWJsZSBBLGRvdWJsZSBCLCBkb3VibGUgQywgZG91YmxlIHgsIGRvdWJsZSB5KSB7CiAgZG91YmxlIHZhbHVlID0gQSAqIHggKyBCICogeSArIEM7CiAgcmV0dXJuIHZhbHVlOwp9Cgpkb3VibGUgUm9ja3lNb3VudGFpbnMoaW50IG4sIGRvdWJsZSBheCkgewoKCWRvdWJsZSBzdW0gPSAwLjA7Cglkb3VibGUgcHg9YXJyWzFdLngscHkgPSBhcnJbMV0ueTsKCWRvdWJsZSBjeCA9IGFyclsxXS54OwoJZG91YmxlIGN5PSBhcnJbMV0ueTsKCWZvcihpbnQgaT0yO2k8PW47aSsrKSB7CiAgICAgICBkb3VibGUgQSxCLEM7CiAgICAgICBsaW5lRm9ybWF0aW9uKGN4LGN5LGF4LDAsQSxCLEMpOwogICAgICAgZG91YmxlIHZhbHVlID0gc2V0T25MaW5lKEEsQixDLGFycltpXS54LGFycltpXS55KTsKICAgICAgIGlmKHZhbHVlPDApewogICAgICAgICAgZG91YmxlIHgseTsKICAgICAgICAgIGxpbmVMaW5lSW50ZXJzZWN0aW9uKGN4LGN5LGF4LDAsYXJyW2ktMV0ueCxhcnJbaS0xXS55LGFycltpXS54LGFycltpXS55LHgseSk7CiAgICAgICAgICBzdW0gKz0gZGlzdGFuY2UoeCx5LGFycltpXS54LGFycltpXS55KTsKICAgICAgICAgIGN4ID0gYXJyW2ldLng7CiAgICAgICAgICBjeSA9IGFycltpXS55OwogICAgICAgfQogICAgICAgZWxzZSBpZih2YWx1ZSA9PSAwKSB7CiAgICAgICAgICAgICBjeD1hcnJbaV0ueDsKICAgICAgICAgICAgIGN5PWFycltpXS55OwogICAgICAgfQogICAgICAgZWxzZSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgIH0KCgl9CglyZXR1cm4gc3VtOwp9CgppbnQgbWFpbigpCnsKCSBpbnQgVCx0OwoJIHNjYW5mKCIlZCIsJlQpOwoJIGZvcih0ID0gMTsgdCA8PSBUOyB0KyspIHsKCQlpbnQgbjsKCQlkb3VibGUgYXg7CgkJc2NhbmYoIiVkICVsZiIsJm4sJmF4KTsKCQlmb3IoaW50IGk9MTtpPD1uO2krKykgewoJCQlzY2FuZigiJWxmICVsZiIsJmFycltpXS54LCZhcnJbaV0ueSk7CgkJfQoJCWRvdWJsZSAgYW5zID0gUm9ja3lNb3VudGFpbnMobixheCk7CgkJcHJpbnRmKCJDYXNlICVkOiAlMC4xMGxmXG4iLHQsIGFucyk7CgkgfQoJIHJldHVybiAwOwp9Cg==