#include // ver2.4.4 #include //#include //#include #define fmin brent_find_minima #define int long long #define endl "\n" #define ALL(v) (v).begin(),(v).end() #define COUNT(a,k) upper_bound(ALL(a),k)-lower_bound(ALL(a),k) #define BIGGER(a,k) a.end()-upper_bound(ALL(a),k) #define SMALLER(a,k) lower_bound(ALL(a),k)-a.begin() #define Vi vector #define VVi vector #define VVVi vector #define Vm vector #define Vs vector #define Pii pair #define Pdd pair #define VPii vector #define Tiii tuple #define VTiii vector #define PQi priority_queue #define PQir priority_queue,greater> #define pb push_back #define mp make_pair #define mt make_tuple #define itos to_string #define stoi stoll #define FI first #define SE second #define cYES cout<<"YES"<()) #define rep(i,a,b) for(int i=a;i=b;i--) #define dem(a,b) ((a+b-1)/(b)) #define Vin(a) rep(iI,0,a.size())cin>>a[iI] #define INF 3000000000000000000 // 3.0*10^18(MAXの1/3くらい) #define MAX LLONG_MAX #define PI 3.141592653589793238462 #define MOD 1000000007 // 10^9 + 7 using namespace std; /* fmin(f,L,R,100) で関数の最小値を(x,min)で返す */ //using boost::math::tools::brent_find_minima; /* cpp_int (任意の長さのint) */ //using boost::multiprecision::cpp_int; /* デバッグ用 */ void Vout(auto a){if(a.size()==0) cout<<"."<0)cout<0)cerr<n)return 0;if((n-r)n-r;--i){a=a*i;}for(int i=1;in)return 0;if((n-r)n-r;--i){a=a*i%MOD;}for(int i=1; i= MOD) x -= MOD; return *this; } mint& operator-=(const mint a) { if ((x += MOD-a.x) >= MOD) x -= MOD; return *this; } mint& operator*=(const mint a) { (x *= a.x) %= MOD; return *this; } mint operator+(const mint a) const { mint res(*this); return res+=a; } mint operator-(const mint a) const { mint res(*this); return res-=a; } mint operator*(const mint a) const { mint res(*this); return res*=a; } mint pow(int t) const { if (!t) return 1; mint a = pow(t>>1); a *= a; if (t&1) a *= *this; return a; } mint inv() const { return pow(MOD-2); } mint& operator/=(const mint a) { return (*this) *= a.inv(); } mint operator/(const mint a) const { mint res(*this); return res/=a; } }; vector divisor(int n) { // 約数列挙 O(√n) Vi r;for(int i=1;i*i<=n;i++){if(n%i==0){r.pb(i);if(i*i!=n)r.pb(n/i);}} sort(ALL(r));return r;} signed main() { cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);cout<> h >> w >> k; char c; cin >> c; Vi ta(h),yo(w); Vin(yo); Vin(ta); if(k==1) {cout << h*w << endl;return 0;} if(c=='+'){ map yok,tak; rep(i,0,w){ yok[yo[i]%k]++; } rep(i,0,h){ tak[ta[i]%k]++; } int ans = 0; for (auto p : yok ) { auto nowk = p.first; auto v = p.second; ans += v*(tak[k-nowk]); } ans += tak[0]*yok[0]; cout << ans << endl; /* while(1){ int time = clock(); if(time >= 1995000) return 0; } */ } else { rep(i,0,h) { ta[i] = gcd(k,ta[i]); } rep(i,0,w) { yo[i] = gcd(k,yo[i]); } sort(ALL(ta)); sort(ALL(yo)); //Verr(ta); //Verr(yo); Vi di = divisor(k); int m = di.size(); Vi kot(m),koy(m); map to; rep(i,0,m) to[di[i]] = i; //Verr(di); rep(i,0,h) kot[to[ta[i]]]++; rep(i,0,w) koy[to[yo[i]]]++; Vi kott(m),koyy(m); repreq(i,m-1,0){ if(kot[i]==0) continue; repreq(j,m-1,0){ if(di[i]%di[j]==0) kott[j] += kot[i]; } } int now; int ans = 0; rep(i,0,w){ now = k/yo[i]; now = to[now]; ans += kott[now]; } cout << ans << endl; } return 0; }