← Home
package main

import (
	"bufio"
	"io"
	"math/big"
	"os"
)

func nextRand(x *uint64) uint64 {
	*x ^= *x >> 12
	*x ^= *x << 25
	*x ^= *x >> 27
	return *x * 2685821657736338717
}

func dayCost(idx []int, s, w []int64, target int64, seed *uint64) (int64, int64, int64) {
	l, r := 0, len(idx)
	var full int64
	for {
		if target == 0 || l >= r {
			return full, 0, 1
		}
		p := l + int(nextRand(seed)%uint64(r-l))
		pv := idx[p]
		pvS := s[pv]
		pvW := w[pv]

		lt, i, gt := l, l, r
		var wLess, cLess, wEq, cEq int64

		for i < gt {
			j := idx[i]
			left := s[j] * pvW
			right := pvS * w[j]
			if left < right {
				wLess += w[j]
				cLess += s[j]
				idx[lt], idx[i] = idx[i], idx[lt]
				lt++
				i++
			} else if left > right {
				gt--
				idx[i], idx[gt] = idx[gt], idx[i]
			} else {
				wEq += w[j]
				cEq += s[j]
				i++
			}
		}

		if target <= wLess {
			r = lt
		} else if target <= wLess+wEq {
			full += cLess
			rem := target - wLess
			if rem == 0 {
				return full, 0, 1
			}
			return full, rem * pvS, pvW
		} else {
			full += cLess + cEq
			target -= wLess + wEq
			l = gt
		}
	}
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	pos := 0
	nextInt := func() int64 {
		for pos < len(data) && (data[pos] < '0' || data[pos] > '9') {
			pos++
		}
		var v int64
		for pos < len(data) && data[pos] >= '0' && data[pos] <= '9' {
			v = v*10 + int64(data[pos]-'0')
			pos++
		}
		return v
	}

	n := int(nextInt())
	m := int(nextInt())
	W := nextInt()

	w := make([]int64, m)
	for i := 0; i < m; i++ {
		w[i] = nextInt()
	}

	s := make([]int64, m)
	for i := 0; i < m; i++ {
		s[i] = nextInt()
	}

	a := make([]int64, m)
	for i := 0; i < m; i++ {
		a[i] = nextInt()
	}

	idx := make([]int, m)
	var totalInt int64
	fracTotal := new(big.Rat)
	tmp := new(big.Rat)
	seed := uint64(88172645463393265)

	for day := 0; day < n; day++ {
		for i := 0; i < m; i++ {
			idx[i] = i
		}

		full, num, den := dayCost(idx, s, w, W, &seed)
		totalInt += full
		if num != 0 {
			tmp.SetFrac64(num, den)
			fracTotal.Add(fracTotal, tmp)
		}

		if day+1 < n {
			for i := 0; i < m; i++ {
				s[i] -= a[i]
			}
		}
	}

	res := new(big.Rat).SetInt64(totalInt)
	res.Add(res, fracTotal)

	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	out.WriteString(res.FloatString(12))
	out.Flush()
}