You are given an array a of length n and array b of length m both consisting of only integers 0 and 1. Consider a matrix c of size n × m formed by following rule: c_{i, j} = a_i ⋅ b_j (i.e. a_i multiplied by b_j). It's easy to see that c consists of only zeroes and ones too.

How many subrectangles of size (area) k consisting only of ones are there in c?

A subrectangle is an intersection of a consecutive (subsequent) segment of rows and a consecutive (subsequent) segment of columns. I.e. consider four integers x_1, x_2, y_1, y_2 (1 ≤ x_1 ≤ x_2 ≤ n, 1 ≤ y_1 ≤ y_2 ≤ m) a subrectangle c[x_1 ... x_2][y_1 ... y_2] is an intersection of the rows x_1, x_1+1, x_1+2, ..., x_2 and the columns y_1, y_1+1, y_1+2, ..., y_2.

The size (area) of a subrectangle is the total number of cells in it.

Input

The first line contains three integers n, m and k (1 ≤ n, m ≤ 40 000, 1 ≤ k ≤ n ⋅ m), length of array a, length of array b and required size of subrectangles.

The second line contains n integers a_1, a_2, …, a_n (0 ≤ a_i ≤ 1), elements of a.

The third line contains m integers b_1, b_2, …, b_m (0 ≤ b_i ≤ 1), elements of b.

Output

Output single integer — the number of subrectangles of c with size (area) k consisting only of ones.

Examples

Input


3 3 2
1 0 1
1 1 1


Output


4


Input


3 5 4
1 1 1
1 1 1 1 1


Output


14

Note

In first example matrix c is:

<image>

There are 4 subrectangles of size 2 consisting of only ones in it:

<image>

In second example matrix c is:

<image>
import java.io.*;
import java.util.*;

public class Main {
  public static void main(String[] args) throws Exception {
    Reader.init(System.in);
    int n = Reader.nextInt();
    int m = Reader.nextInt();
    int k = Reader.nextInt();
    boolean[] a = new boolean[n];
    boolean[] b = new boolean[m];
    for (int i = 0; i < n; i++) {
      if (Reader.nextInt() == 1) {
        a[i] = true;
      }
    }
    for (int i = 0; i < m; i++) {
      if (Reader.nextInt() == 1) {
        b[i] = true;
      }
    }
    long cnt = solve(a, b, k);
    System.out.println(cnt);
  }

  public static long solve(boolean[] a, boolean[] b, int k) {
    Map<Integer, Integer> aLenToCnt = genLenToCnt(a);
    Map<Integer, Integer> bLenToCnt = genLenToCnt(b);
    List<Integer> factors = factors(k);
    long cnt = 0;
    for (Integer aLen : aLenToCnt.keySet()) {
      for (Integer bLen : bLenToCnt.keySet()) {
        int shapeCnt = aLenToCnt.get(aLen) * bLenToCnt.get(bLen);
        for (int i = 0; i < factors.size(); i += 2) {
          int f1 = factors.get(i);
          int f2 = factors.get(i + 1);
          if ((1 <= f1 && f1 <= aLen && 1 <= f2 && f2 <= bLen)) {
            cnt += shapeCnt * (aLen - f1 + 1) * (bLen - f2 + 1);
          }
          if ((f1 != f2) && (1 <= f2 && f2 <= aLen && 1 <= f1 && f1 <= bLen)) {
            cnt += shapeCnt * (bLen - f1 + 1) * (aLen - f2 + 1);
          }
        }
      }
    }
    return cnt;
  }

  public static List<Integer> factors(int n) {
    List<Integer> factors = new ArrayList<>();
    int last = (int) Math.sqrt(n);
    for (int i = 1; i <= last; i++) {
      if (n % i == 0) {
        factors.add(i);
        factors.add(n / i);
      }
    }
    return factors;
  }

  public static Map<Integer, Integer> genLenToCnt(boolean[] x) {
    Map<Integer, Integer> lenToCnt = new HashMap<>();
    int len = 0;
    for (int i = 0; i < x.length; i++) {
      if (x[i]) {
        len++;
      } else if (len != 0) {
        update(lenToCnt, len);
        len = 0;
      }
    }
    if (len != 0) {
      update(lenToCnt, len);
    }
    return lenToCnt;
  }

  public static void update(Map<Integer, Integer> map, Integer key) {
    if (map.containsKey(key)) {
      map.put(key, map.get(key) + 1);
    } else {
      map.put(key, 1);
    }
  }

  static class Reader {
    static BufferedReader reader;
    static StringTokenizer tokenizer;

    static void init(InputStream input) {
      reader = new BufferedReader(new InputStreamReader(input));
      tokenizer = new StringTokenizer("");
    }

    static String next() throws IOException {
      while (!tokenizer.hasMoreTokens())
        tokenizer = new StringTokenizer(reader.readLine());
      return tokenizer.nextToken();
    }

    static int nextInt() throws IOException {
      return Integer.parseInt(next());
    }

    static long nextLong() throws IOException {
      return Long.parseLong(next());
    }

    static double nextDouble() throws IOException {
      return Double.parseDouble(next());
    }

    static String nextLine() {
      String str = "";
      try {
        str = reader.readLine();
      } catch (IOException e) {
        e.printStackTrace();
      }
      return str;
    }
  }
}