#include <bits/stdc++.h>
using namespace std;
const int MAXN = 10010;
const int MAXD = 1060;
int n, m;
long long arr[MAXN], B, p, q[MAXN];
vector<long long> pr;
long long dp[MAXD];
inline long long gcd(const long long& a, const long long& b) {
  if (a == 0) return b;
  return gcd(b % a, a);
}
inline long long mod(const long long& a) {
  return (a >= 0) ? (a % p) : ((a % p) + p) % p;
}
inline long long mod_add(const long long& a, const long long& b) {
  return mod(mod(a) + mod(b));
}
inline long long mod_mult(const long long& a, const long long& b) {
  return mod(mod(a) * mod(b));
}
inline long long mod_pow(long long a, long long b) {
  long long ret = 1;
  while (b) {
    if (b & 1) ret = mod_mult(ret, a);
    a = mod_mult(a, a);
    b >>= 1;
  }
  return ret;
}
inline void find_pr(long long v, vector<long long>& prim) {
  for (long long i = 1; i * i <= v; i++) {
    if (v % i == 0) {
      prim.push_back(i);
      if (i * i != v) prim.push_back(v / i);
    }
  }
  sort(prim.begin(), prim.end());
}
inline long long ord(const long long& a) {
  for (const long long& v : pr) {
    if (mod_pow(a, v) == 1) return v;
  }
  return -1;
}
int main(void) {
  scanf("%d %d %lld", &n, &m, &p);
  for (int i = 0; i < n; i++) scanf("%lld", arr + i);
  find_pr(p - 1, pr);
  long long ex;
  for (int i = 0; i < m; i++) {
    scanf("%lld", &ex);
    if (i == 0)
      B = ex;
    else
      B = gcd(B, ex);
  }
  memset(dp, 0, sizeof(dp));
  long long ans = 0;
  for (int i = 0; i < n; i++) {
    q[i] = ord(mod_pow(arr[i], B));
    for (int j = 0; j < (int)pr.size() && pr[j] <= q[i]; j++) {
      if (q[i] % pr[j] == 0) dp[j] = pr[j];
    }
  }
  for (int i = 0; i < (int)pr.size(); i++) {
    for (int j = i + 1; j < (int)pr.size(); j++) {
      if (pr[j] % pr[i] == 0)
        if (dp[j]) dp[j] -= dp[i];
    }
    ans += dp[i];
  }
  printf("%lld\n", ans);
  return 0;
}
