import java.util.*; import java.io.*; @SuppressWarnings("unused") public class Main { FastScanner in; PrintWriter out; int MOD = (int)1e9+7; long ceil(long a, long b){return (a + b - 1) / b;} long gcd(long a, long b){return b == 0 ? a : gcd(b, a % b);} long lcm(long a, long b){return a / gcd(a, b) * b;} void solve(){ int N = in.nextInt(), M = in.nextInt(), K = in.nextInt(); char op = in.nextChar(); long[] B = in.nextLongArray(M), A = in.nextLongArray(N); if(op == '+'){ MultiSet multiSet = new MultiSet<>(); long sum = 0; for(int i = 0; i < N; i++) multiSet.add(A[i] % K); for(int i = 0; i < M; i++) sum += multiSet.count((K - B[i] % K) % K); out.println(sum); }else{ MultiSet multiSet = new MultiSet<>(); long sum = 0; for(int i = 0; i < N; i++) multiSet.add(gcd(K, A[i])); for(int i = 0; i < M; i++){ long v = gcd(K, B[i]); for(Map.Entry e : multiSet.map.entrySet()){ if((e.getKey() * v) % K == 0) sum += e.getValue(); } } out.println(sum); } } class MultiSet>{ TreeMap map = new TreeMap<>(); int num = 0; public int add(T e){ map.put(e, map.getOrDefault(e, 0) + 1); num++; return map.get(e); } public int add(T e, int n){ map.put(e, map.getOrDefault(e, 0) + n); num += n; return map.get(e); } //要素eが集合に含まれない<=>mapにeのマッピングは存在しない public boolean remove(T e){ if(!map.containsKey(e)) return false; int c = map.get(e); if(c == 1) map.remove(e); else map.put(e, c - 1); num--; return true; } public boolean remove(T e, int n){ if(map.getOrDefault(e, 0) < n) return false; int c = map.get(e); if(c == n) map.remove(e); else map.put(e, c - n); num -= n; return true; } public boolean delete(T e){ if(!map.containsKey(e)) return false; num -= map.get(e); map.remove(e); return true; } public int count(T e){return map.getOrDefault(e, 0);} public int size(){return num;}//map.size()ではなく、集合に追加された要素数を返す public boolean isEmpty(){return map.isEmpty();} public boolean contains(T e){return map.containsKey(e);} public T lower(T e){return map.lowerKey(e);} //max(