4
#include<stdio.h>
#include<string.h>
#include<math.h>
const int maxn=105;
const int oo=1000000000;
int test,ncp,nroad,ncm1,confdist,startisect,endisect,startdir,i,j,k;
bool visit[360],chp[maxn];
int ans[1005],p[1005];
int marker[maxn][360],op[maxn][360],er[maxn][360],id[maxn][360],len[maxn][360];
int l1,l2,tot,pn;
bool init()
{
int i,j,x,y,rx,ry,l;
++test;
scanf("%d%d%d%d%d%d%d",&ncp,&nroad,&ncm1,&confdist,&startisect,&endisect,&startdir);
if(startisect==0)
return false;
memset(chp,0,sizeof(chp));
for(i=1;i<=ncp;i++)
{
scanf("%d",&x);
chp[x]=true;
}
memset(id,0,sizeof(id));
for(i=1;i<=nroad;i++)
{
scanf("%d %d %d %d %d",&x,&y,&rx,&ry,&l);
id[x][rx]=i;len[x][rx]=l;
op[x][rx]=y;er[x][rx]=ry;
id[y][ry]=i;len[y][ry]=l;
op[y][ry]=x;er[y][ry]=rx;
}
for(i=1;i<=maxn;++i)
for(j=0;j<=359;++j)
marker[i][j]=oo;
for(i=1;i<=ncm1;++i)
{
scanf("%d%d%d",&x,&y,&l);
for(j=0;j<=359;++j)
if(id[x][j]==y)
{
if(l<marker[x][j])
marker[x][j]=l;
if(len[x][j]-l<marker[op[x][j]][er[x][j]])
marker[op[x][j]][er[x][j]]=len[x][j]-l;
}
}
return true;
}
bool find(int &k,int &kdir,int &sum)
{
int i,j,v,vdir,pre;
sum=0;pn=0;v=k;vdir=kdir;
while(1)
{
p[++pn]=id[v][vdir];
if(marker[v][vdir]+sum<=confdist)
{
k=op[v][vdir];
kdir=(er[v][vdir]+180)%360;
sum+=len[v][vdir];
return true;
}
if(len[v][vdir] + sum>confdist)
{
sum=confdist;
return false;
}
sum+=len[v][vdir];
pre=vdir;
vdir=(er[v][vdir]+180)%360;
v=op[v][pre];
if(chp[v])
return false;
for(i=0;i<=180;++i)
{
if(i==180)
return false;
j=(vdir+i)%360;
if(id[v][j]>0)
{
vdir=j;
break;
}
j=(vdir+360-i)%360;
if(id[v][j]>0)
{
vdir=j;
break;
}
}
}
return false;
}
void work()
{
int i,j,k,kdir,v,delta;
k=startisect;
kdir=startdir;
l1=l2=tot=0;
do
{
if(chp[k])
{
memset(visit,0,sizeof(visit));
visit[(kdir+180)%360]=true;
while(1)
{
v=-1;
for(i=0;i<=180;++i)
{
j=(kdir+i)%360;
if(id[k][j]>0 && !visit[j])
{
v=j;
break;
}
j=(kdir+360-i)%360;
if(id[k][j]>0 && !visit[j])
{
v=j;
break;
}
}
visit[v]=true;
if(find(k,v,delta))
{
l1+=delta;
l2+=delta;
for(i=1;i<=pn;++i)
ans[++tot]=p[i];
kdir=v;
break;
}
else
{
kdir=(v+180)%360;
l2+=delta*2;
}
}
}
else
{
for(i=0;i<=180;++i)
{
j=(kdir+i)%360;
if(id[k][j]>0)
{
l1+=len[k][j];
l2+=len[k][j];
ans[++tot]=id[k][j];
kdir=(er[k][j] + 180)%360;
k=op[k][j];
break;
}
j=(kdir+360-i)%360;
if(id[k][j]>0)
{
l1+=len[k][j];
l2+=len[k][j];
ans[++tot]=id[k][j];
kdir=(er[k][j]+180)%360;
k=op[k][j];
break;
}
}
}
}while(k!=endisect);
printf("Case %d:\n",test);
printf(" Length of hare's route is %d\n",l1);
printf(" Length of hound's search is %d\n",l2);
printf(" Route:");
for(i=1;i<=tot;++i)
printf(" %d",ans[i]);
printf("\n");
printf("\n");
}
int main()
{
test=0;
while(init())
work();
return 0;
}
5
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
const int maxn=22;
const int maxways=30000;
int n,i,j,new_tot,nodes,last,node,cases,ans[maxways][maxn],new_ans[maxways][maxn];
int l[maxn*2],r[maxn*2],step[maxn];
char a[maxn];
void split(int node)
{
int i,j,k,f;
new_tot=0;
for(i=0;ans[i][0];i++)
{
f=ans[i][node];
for(j=f-1;j>(f-1)/2;j--)
if(j<=ans[i][nodes])
{
for(k=0;k<nodes;k++)
{
if(k>=node)
new_ans[new_tot][k]=ans[i][k+1];
else
new_ans[new_tot][k]=ans[i][k];
}
new_ans[new_tot][k]=j;
new_ans[new_tot++][k+1]=f-j;
}
}
nodes++;
memcpy(ans,new_ans,new_tot*maxn*4);
ans[new_tot][0]=0;
}
int main()
{
while(scanf("%d",&n)&&n)
{
memset(l,0,sizeof(l));
memset(r,0,sizeof(r));
last=0;
for(i=0;i<n;i++)
{
scanf(" %s",a);
node=0;
for(j=0;a[j];j++)
if(a[j]=='0')
{
if(!l[node])
{
l[node]=++last;
r[node]=++last;
}
node=l[node];
}
else
{
if(!r[node])
{
l[node]=++last;
r[node]=++last;
}
node=r[node];
}
}
i=0;
j=0;
node=0;
nodes=0;
ans[0][0]=100;
ans[1][0]=0;
while(i<=j)
{
if(l[step[i]])
{
split(node);
step[++j]=r[step[i]];
step[++j]=l[step[i]];
}
else
node++;
i++;
}
printf("Case %d: %d\n",++cases,new_tot);
}
return 0;
}
6
#include<stdio.h>
int L,n,i,j,k,cases;
long long Ans,t1,t2;
int main()
{
cases=0;
while(1)
{
scanf("%d",&L);
if(!L)
break;
if(L<4||L%2)
{
printf("Case %d: 0\n",++cases);
continue;
}
n=(L-4)/2;
t1=(n+3)*(n+2)*(n+1)/6;
t2=(n+3)*(n+2)*(n+1);t2=t2*n/24;
Ans=t1+2*t2;
printf("Case %d: %lld\n",++cases,Ans);
}
}
7
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <iostream>
#include <iomanip>
using namespace std;
double a[11],c,u;
int n,i,t;
double f(double k)
{
double b[22],r[11],s,x,y;
int i,j;
memcpy(r,a,sizeof(r));
r[1]-=k;
r[0]-=-k*c+u;
memset(b,0,sizeof(b));
for(i=0;i<11;i++)
for(j=0;j<11;j++)
b[i+j]+=r[i]*r[j];
for(i=21;i;i--)
b[i]=b[i-1]/i;
s=0;
x=1;
y=1;
for(i=1;i<22;i++)
{
x*=c;
s+=b[i]*x;
y=-y;
s-=b[i]*y;
}
return s;
}
double g(double k)
{
double b[22],r[11],s,x;
int i,j;
memcpy(r,a,sizeof(r));
r[1]-=k;
r[0]-=-k*c+u;
memset(b,0,sizeof(b));
for(i=0;i<11;i++)
for(j=0;j<11;j++)
b[i+j]+=r[i]*r[j];
for(i=21;i;i--)
b[i]=b[i-1]/i;
s=0;
x=1;
for(i=1;i<22;i++)
{
x*=c;
s+=b[i]*(1-x);
}
return s;
}
double h(double v)
{
double p0,p1,p2,v0,v1,mf,mg;
u=v;
p0=f(-0.5);
p1=f(0.5);
p2=f(1.5);
v0=p1-p0;
v1=p2-p1;
mf=f(v0/(v0-v1));
p0=g(-0.5);
p1=g(0.5);
p2=g(1.5);
v0=p1-p0;
v1=p2-p1;
mg=g(v0/(v0-v1));
return mf+mg;
}
void work()
{
double p0,p1,p2,v0,v1,bk;
printf("Case %d: ",++t);
p0=h(-0.5);
p1=h(0.5);
p2=h(1.5);
v0=p1-p0;
v1=p2-p1;
u=v0/(v0-v1);
p0=f(-0.5);
p1=f(0.5);
p2=f(1.5);
v0=p1-p0;
v1=p2-p1;
bk=v0/(v0-v1);
printf("%.3lf %.3lf",bk,-bk*c+u);
p0=g(-0.5);
p1=g(0.5);
p2=g(1.5);
v0=p1-p0;
v1=p2-p1;
bk=v0/(v0-v1);
printf(" %.3lf %.3lf\n",bk,-bk*c+u);
}
int main()
{
while(scanf("%d",&n)&&n)
{
memset(a,0,sizeof(a));
for(i=n;i>=0;i--)
scanf("%lf",&a[i]);
scanf("%lf",&c);
work();
}
return 0;
}