#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(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]); } cout << ans << endl; } else { Vi di = divisor(k); Vi tact(di.size()); unordered_map to; rep(i,0,di.size()) to[di[i]] = i; rep(i,0,di.size()){ int now = di[i]; rep(j,0,h){ if(ta[j]%now==0) tact[i]++; } } cerr << di.size() << endl; int ans = 0; rep(i,0,w){ int now = gcd(k,yo[i]); now = k/now; now = to[now]; ans += tact[now]; } cout << ans << endl; } return 0; }