#include using namespace std; typedef long long ll; typedef pair pii; #define pb push_back #define all(a) a.begin(), a.end() #define sz(a) ((int)a.size()) #ifdef Doludu template ostream& operator << (ostream &o, vector vec) { o << "{"; int f = 0; for (T i : vec) o << (f++ ? " " : "") << i; return o << "}"; } void bug__(int c, auto ...a) { cerr << "\e[1;" << c << "m"; (..., (cerr << a << " ")); cerr << "\e[0m" << endl; } #define bug_(c, x...) bug__(c, __LINE__, "[" + string(#x) + "]", x) #define bug(x...) bug_(32, x) #define bugv(x...) bug_(36, vector(x)) #define safe bug_(33, "safe") #else #define bug(x...) void(0) #define bugv(x...) void(0) #define safe void(0) #endif const int mod = 998244353, N = 2000006; //a * p.first + b * p.second = gcd(a, b) pair extgcd(ll a, ll b) { if (b == 0) return {1, 0}; auto [y, x] = extgcd(b, a % b); return pair(x, y - (a / b) * x); } int main() { ios::sync_with_stdio(false), cin.tie(0); int n; ll k; int m; cin >> n >> k >> m; vector a(n); vector pre(n + 1); for (int i = 0; i < n; ++i) cin >> a[i].first; for (int i = 0; i < n; ++i) cin >> a[i].second; for (int i = 0; i < n; ++i) { pre[i + 1] = (pre[i] + 1ll * a[i].first * a[i].second) % m; } int x1 = 0, y1 = 0; int x2 = 0, y2 = k; { ll z = k; while (x2 < n && z >= a[x2].first) { z -= a[x2].first; x2++; } y2 = z; } ll ans = 0; while (x2 < n) { int nxt = min(a[x1].first - y1, a[x2].first - y2); int z1 = (pre[x1] + 1ll * y1 * a[x1].second) % m; int z2 = (pre[x2] + 1ll * y2 * a[x2].second) % m; // z1 + a[x1].second * i = z2 + a[x2].second * i int z = (z2 - z1 + m) % m; int x = (a[x1].second - a[x2].second + m) % m; // xi = z (mod m) bug(x, z); if (x == 0) { if (z == 0) ans += nxt; } else { int g = gcd(x, m); if (z % g == 0) { auto [r1, r2] = extgcd(x, m); ll fr = 1ll * r1 * (z / g); fr %= m; if (fr < 0) fr += m; bug(fr, x, z, m); if (fr < nxt) { ans += (nxt - fr - 1) / (m / g) + 1; } } } y1 += nxt; y2 += nxt; if (y1 == a[x1].first) y1 = 0, x1++; if (y2 == a[x2].first) y2 = 0, x2++; } int z1 = (pre[x1] + 1ll * y1 * a[x1].second) % m; int z2 = pre[n]; if (z1 == z2) ans++; cout << ans << "\n"; }