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.*;
import java.text.*;
import java.lang.*;
import java.math.*;
 
public class Main{
    static ArrayList[] a = new ArrayList[200001];
    static long f(long x , long y , long a , long b) {
    	long x1 = a - x + 1;
    	long y1 = b - y + 1;
    	if(x1 >= 0 && y1 >= 0 )
    		return x1 * y1;
    	else
    		return 0L;
    }
	public void solve () throws IOException  {
       
    	InputReader in = new InputReader(System.in);
        PrintWriter pw = new PrintWriter(System.out);
        
        int n = in.nextInt();
        int m = in.nextInt();
        long k = in.nextLong();
        int a[] = new int [n];
        int b[] = new int [m];
        for(int i = 0 ; i < n ; i ++)
        	a[i] = in.nextInt();
        for(int i = 0 ; i < m ; i++)
        	b[i] = in.nextInt();
        long cnt  = 0 ;
        HashSet<Long>s = new HashSet<>();
        long count [][] = new long [40001][2];
        for(int i = 0 ; i < n ; i++) {
        	if( a[i] == 0) {
        		if(cnt > 0) {
        			count [(int) cnt][0]++;
            		s.add(cnt);

        		}
        		cnt = 0;
        		continue ;
        	}
        	cnt ++;
        }
        if(cnt > 0) {
			count [(int) cnt][0]++;
        	s.add(cnt);

        }
        cnt  = 0;
        HashSet<Long>s1 = new HashSet<>();
        for(int i = 0 ; i < m ; i++) {
        	if( b[i] == 0) {
        		if(cnt > 0)
        		{
        			s1.add(cnt);
        			count [(int) cnt][1]++;
        		}
        		cnt = 0;
        		continue ;
        	}
        	cnt ++;
        }
        if(cnt > 0) 
        {
			count [(int) cnt][1]++;
        	s1.add(cnt);
        }
        Vector<Long>v = new Vector<>();
        for(long i = 1 ; i * i <= k ; i++) {
        	if( k % i == 0) {
        		v.add(i);
        	}
        }
        Vector<Long>t1 = new Vector<>(s);
        Vector<Long>t2 = new Vector<>(s1);
        long ans = 0L;
        for(int i = 0 ; i < t1.size() ; i++) {
        	for(int j = 0; j < t2.size() ; j++) {
        		long temp = 0L;
        		for(int l = 0 ;  l < v.size() ; l++) {
        			long xx = k / v.get(l);
        			long yy = v.get(l);
        			
        			temp += f(xx , yy , t1.get(i) , t2.get(j));
        			if(xx != yy)
        			temp += f(yy , xx , t1.get(i) , t2.get(j));
        			
        		}
        		long c1 = t1.get(i);
        		long c2 = t2.get(j);
        		ans += (count[(int) c1][0] * count [(int) c2][1] * temp); 
        	}
        
        }
        pw.println(ans);
        
        pw.flush(); 
        pw.close();
    }
    public static void main(String[] args) throws Exception {
        
        
        new Thread(null,new Runnable() {
            public void run() {
                    try {
                        new Main().solve();
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
						e.printStackTrace();
					}
            }  
        },"1",1<<26).start();
        
        
    }
   
    static void debug(Object... o) {
        System.out.println(Arrays.deepToString(o));
        }
        
        static class InputReader 
        {
        private final InputStream stream;
        private final byte[] buf = new byte[8192];
        private int curChar, snumChars;
        private SpaceCharFilter filter;
 
        public InputReader(InputStream stream) 
        {
            this.stream = stream;
        }
        public int snext() 
        {
            if (snumChars == -1)
                throw new InputMismatchException();
            if (curChar >= snumChars) 
            {
                curChar = 0;
                try 
                {
                    snumChars = stream.read(buf);
                } 
                catch (IOException e) 
                {
                    throw new InputMismatchException();
                }
                if (snumChars <= 0)
                    return -1;
            }
            return buf[curChar++];
        }
 
        public int nextInt() 
        {
            int c = snext();
            while (isSpaceChar(c)) 
            {
                c = snext();
            }
            int sgn = 1;
            if (c == '-')
            {
                sgn = -1;
                c = snext();
            }
            int res = 0;
            do 
            {
                if (c < '0' || c > '9')
                    throw new InputMismatchException();
                res *= 10;
                res += c - '0';
                c = snext();
            } while (!isSpaceChar(c));
            return res * sgn;
        }
 
        public long nextLong()
        {
            int c = snext();
            while (isSpaceChar(c)) 
            {
                c = snext();
            }
            int sgn = 1;
            if (c == '-') 
            {
                sgn = -1;
                c = snext();
            }
            long res = 0;
            do 
            {
                if (c < '0' || c > '9')
                    throw new InputMismatchException();
                res *= 10;
                res += c - '0';
                c = snext();
            } while (!isSpaceChar(c));
            return res * sgn;
        }
 
        public int[] nextIntArray(int n) 
        {
            int a[] = new int[n];
            for (int i = 0; i < n; i++) 
            {
                a[i] = nextInt();
            }
            return a;
        }
 
        public String readString()
        {
            int c = snext();
            while (isSpaceChar(c)) 
            {
                c = snext();
            }
            StringBuilder res = new StringBuilder();
            do 
            {
                res.appendCodePoint(c);
                c = snext();
            } while (!isSpaceChar(c));
            return res.toString();
        }
 
        public String nextLine() 
        {
            int c = snext();
            while (isSpaceChar(c))
                c = snext();
            StringBuilder res = new StringBuilder();
            do 
            {
                res.appendCodePoint(c);
                c = snext();
            } while (!isEndOfLine(c));
            return res.toString();
        }
 
        public boolean isSpaceChar(int c) 
        {
            if (filter != null)
                return filter.isSpaceChar(c);
            return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
        }
 
        private boolean isEndOfLine(int c) 
        {
            return c == '\n' || c == '\r' || c == -1;
        }
 
        public interface SpaceCharFilter
        {
            public boolean isSpaceChar(int ch);
        }
    }
        public static long mod = 1000000007;
        public static int d;
        public static int p;
        public static int q;
        public void extended(int a,int b) {
            if(b==0) {
                d=a;
                p=1;
                q=0;
            }
            else
            {
                extended(b,a%b);
                int temp=p;
                p=q;
                q=temp-(a/b)*q;
            }
        }
       
        
        public static long binaryExponentiation(long x,long n)
        {
            long result=1;
            while(n>0)
            {
                if(n % 2 ==1)
                    result=result * x;
                x=x*x;
                n=n/2;
            }
            return result;
        }
        
        public static long[] shuffle(long[] a,Random gen)
        {
            int n = a.length;
            for(int i=0;i<n;i++)
            {
                int ind = gen.nextInt(n-i)+i;
                long temp = a[ind];
                a[ind] = a[i];
                a[i] = temp;
            }
            return a;
        }
        
        public static void swap(int a, int b){
            int temp = a;
            a = b;
            b = temp;
        }
        
        public static HashSet<Integer> primeFactorization(int n)
        {
            HashSet<Integer> a =new HashSet<Integer>();
            for(int i=2;i*i<=n;i++)
            {
                while(n%i==0)
                {
                    a.add(i);
                    n/=i;
                }
            }
            if(n!=1)
                a.add(n);
            return a;
        }
        
        public static void sieve(boolean[] isPrime,int n)
        {
            for(int i=1;i<n;i++)
                isPrime[i] = true;
            
            isPrime[0] = false;
            isPrime[1] = false;
            
            for(int i=2;i*i<n;i++)
            {
                if(isPrime[i] == true)
                {
                    for(int j=(2*i);j<n;j+=i)
                        isPrime[j] = false;
                }
            }
        }
        
        public static long GCD(long n,long m)
        {
            if(m==0)
                return n;
            else
                return GCD(m,n%m);
        }
        public static long LCM (long a,long b) {
            return ((a*b)/(GCD(a,b)));
        }
        
        static class pair implements Comparable<pair>
        {
            Integer y ;
            Long x ;
            
            pair(long  l, int w )
            {
                this.x=l;
                this.y=w;
            }

           
            public int compareTo(pair o) {
                int result = x.compareTo(o.x);
                if(result==0)
                    result = y.compareTo(o.y);
                
                return result;
            }  
            
            public String toString()
            {
                return x+" "+y;
            }
            
            public boolean equals(Object o)
            {
                if (o instanceof pair)
                {
                    pair p = (pair)o;
                    return p.x == x && p.y == y ;
                }
                return false;
            }
            public int hashCode()
            {
                return new Long(x).hashCode()*3 + new Long(y).hashCode();
                
            }
        }
        public static int binaryExponentiation(int x,int n)
        {
            int result=1;
            while(n>0)
            {
                if(n % 2 ==1)
                    result=result * x;
                x=x*x;
                n=n/2;
            }
            return result;
        }
        
       
        
        public static int modularExponentiation(int x,int n,int M)
        {
            int result=1;
            while(n>0)
            {
                if(n % 2 ==1)
                    result=(result * x)%M;
                x=(x%M*x)%M;
                n=n/2;
            }
            return result;
        }
        
        public static long modularExponentiation(long x,long n,long M)
        {
            long result=1;
            while(n>0)
            {
                if(n % 2 ==1)
                    result=(result%M * x%M)%M;
                x=(x%M * x%M)%M;
                n=n/2;
            }
            return result;
        }
        
        public static long modInverse(int A,int M)
        {
            return modularExponentiation(A,M-2,M);
        }
        
        public static long modInverse(long A,long M)
        {
            return modularExponentiation(A,M-2,M);
        }
        static class Segment{ 
    		int seg[]; 
    		int a[];
    		int lazy[];
    	    Segment (int n,int b[]){
    			seg=new int[4*n];
    			lazy=new int[4*n];
    			a=new int[b.length];
    			a=b.clone();
    		}
    	    public void build(int node,int start,int end) {
    	    	if(start==end) {
    	    		seg[node]=a[start];
    	    		return ;
    	    	}
    	    	int mid=(start+end)/2;
    	    	build(2*node+1,start,mid);
    	    	build(2*node+2,mid+1,end);
    	    	seg[node]=seg[2*node+1]+seg[2*node+2];
    	    }
    	    public void update(int node,int start,int end,int id,int val) {
    	    	if(start==end) {
    	    		seg[node]=a[start]=val;
    	    		return;
    	    	}
    	    	int mid=(start+end)/2;
    	    	if(id>=start && id<=mid) {
    	    		update(2*node+1,start,mid,id,val);
    	    	}
    	    	else
    	    		update(2*node+2,mid+1,end,id,val);
    	    	seg[node]=seg[2*node+1]+seg[2*node+2];
    	    }
    	    public int query(int node,int start,int end,int l,int r) {
    	    	if(l>end || r<start)
    	    		return 0;
    	    	if(start>=l && end<=r)
    	    		return seg[node];
    	    	
    	    	int  mid=(start+end)/2;
    	    	return (query(2*node+1,start,mid,l,r)+query(2*node+2,mid+1,end,l,r));
    	    }
    	    public void updateRange(int node,int start,int end,int l,int r,int val) {
    	    	if(lazy[node]!=0) {
	    			seg[node] += lazy[node];
    	    		if(start!=end) {
    	    			lazy[2*node+1]+=lazy[node];
    	    			lazy[2*node+2]+=lazy[node];
    	    		}
    	    		lazy[node]=0;
    	    	}
    	    	if(l>end || r<start)
    	    		return ;
    	    	if(start>=l && end<=r) {
    	    		seg[node] += val;
    	    		if(start!=end) {
    	    			lazy[2*node+1]+=val;
    	    			lazy[2*node+2]+=val;
    	    		}
    	    		lazy[node]=0;
    	    		return ;
    	    	}
    	    	int mid=(start+end)/2;
    	    	updateRange(2*node+1,start,mid,l,r,val);
    	    	updateRange(2*node+2,mid+1,end,l,r,val);
    	    	seg[node]=seg[2*node+1]+seg[2*node+2];
    	    }
    	    public int queryRange(int node,int start,int end,int l,int r) {
    	    	if(l>end || r<start)
    	    		return 0;
    	    	if(lazy[node]!=0) {
    	    		seg[node] += lazy[node];
    	    		if(start!=end) {
    	    			lazy[2*node+1]+=lazy[node];
    	    			lazy[2*node+2]+=lazy[node];
    	    		}
    	    		lazy[node]=0;
    	    	}
    	    	if(start>=l && end<=r)
    	    		return seg[node];
    	    	
    	    	int  mid=(start+end)/2;
    	    	return (queryRange(2*node+1,start,mid,l,r)+queryRange(2*node+2,mid+1,end,l,r));
    	    }
    	    
    	}
       
        
                    
         
}