#include #include #include #include #include #include #include #include #include using namespace std; typedef long long int ll; typedef long double ld; #define rep(i,n) for(int i = 0; i < (n); ++i) #define Sort(Array) sort(Array.begin(), Array.end()) #define Reverse(a) reverse(a.begin(), a.end()) #define out(ans) cout << ans << endl; const int MOD = 1000000007; const int INF = 2147483647; //------------↓------------- M -------------- E ---------------- M --------------- O ---------------↓--------------// // コンパイル // g++ -std=c++1z // // -------型変換-------- // int を string に変換 // string s = to_string(n); // string を int に変換 // int n = stoi(s); // // -------二分探索--------- // k以上の値が最初に現れる時のイテレータ // lower_bound(data.begin(), data.end(), k) // kより大きい値が最初の現れる時のイテレータ O(logN) // upper_bound(data.begin(), data.end(), k) // kがdataに存在するかをtrue or falseで返す O(logN) // binary_search(data.begin(), data.end(), k) // // // // // // // //------------↑------------- M -------------- E ---------------- M --------------- O ---------------↑--------------// int main() { int n, m, k; cin >> n >> m >> k; char op; cin >> op; ll a[n], b[m]; rep(i,m) cin >> b[i]; rep(i,n) cin >> a[i]; ll ans = 0; if (op == '+') { rep(i,n) { rep(j,m) { ans += a[i] + b[j]; ans %= k; } } } else { rep(i,n) { rep(j,m) { ans += a[i] * b[j]; ans %= k; } } } out(ans); return 0; }