#!/usr/bin/env python

import sys
import math
import array
import pickle

def init_vals (t,v,rf,n):
  h = t / float(n)
  xd = (rf - 0.5 * (v * v)) * h
  xv = v * math.sqrt(h)
  u = math.exp (xd + xv)
  d = math.exp (xd - xv)
  drift = math.exp (rf * h)
  q = (drift - d) / (u - d)
  return (q, u, d, drift)

def c_stkval (n,s,u,d,j):
  return (s * (math.pow(u,(n-j))) * (math.pow(d,j)))

def gen_initial_optvals (n,s,u,d,k,cp):
  for j in range(n,-1,-1):
    stkval = c_stkval (float(n),s,u,d,float(j))
    v=max(0.0,(cp * (stkval - k)))
    pickle.dump(v, sys.stdout)

def eqn(q,drift,a,b):
  return (((q * a) + (1.0 - q) * b) / drift)

def apply_column(v,v1,acc,pos,chunk,q,drift):
  v1 = acc[0]
  acc[0] = v
  maxcol = min(chunk,pos)
  for idx in range(1,maxcol+1):
    nv1 = eqn(q,drift,acc[idx-1],v1)
    v1 = acc[idx]
    acc[idx] = nv1;
  if maxcol == chunk:
    pickle.dump(acc[maxcol], sys.stdout)

def process_rows(rowstart,rowto,q,drift):
  pickle.dump(rowto, sys.stdout)
  chunk = rowstart - rowto
  acc = array.array('f',[0.0 for x in range(0,chunk+1)])
  v1 = 0.0
  for pos in range(0,rowstart+1):
    v = pickle.load(sys.stdin)
    apply_column(v,v1,acc,pos,chunk,q,drift)

def main():
  s = float(sys.argv[1])
  k = float(sys.argv[2])
  t = float(sys.argv[3])
  v = float(sys.argv[4])
  rf = float(sys.argv[5])
  cp = float(sys.argv[6])
  n = int(sys.argv[7])
  chunk = int(sys.argv[8])
  start = int(sys.argv[9])
  (q,u,d,drift) = init_vals(t,v,rf,n)
  if start == 1:
    pickle.dump(n,sys.stdout)
    gen_initial_optvals(n,s,u,d,k,cp)
  else:
    rowstart = pickle.load(sys.stdin)
    if rowstart == 0:
      print "%.9f\n" % pickle.load(sys.stdin)
    else:
      rowto = max(0,(rowstart - chunk))
      process_rows(rowstart,rowto,q,drift)

if __name__ == "__main__":
  main()
