// includes #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // macros #define ll long long int #define pb emplace_back #define mk make_pair #define pq priority_queue #define FOR(i, a, b) for(int i=(a);i<(b);++i) #define rep(i, n) FOR(i, 0, n) #define rrep(i, n) for(int i=((int)(n)-1);i>=0;i--) #define all(x) (x).begin(),(x).end() #define sz(x) ((int)(x).size()) #define UNIQUE(v) v.erase(unique(v.begin(), v.end()), v.end()) using namespace std; // types typedef pair P; typedef pair Pl; typedef pair Pll; typedef pair Pd; // constants const int inf = 1e9; const ll linf = 1LL << 50; const double EPS = 1e-10; const int mod = 1e9 + 7; // solve template bool chmax(T &a, const T &b){if(a < b){a = b; return 1;} return 0;} template bool chmin(T &a, const T &b){if(a > b){a = b; return 1;} return 0;} template struct MergableRangeSet{ using PT = pair; set st; MergableRangeSet(){} // [l, r) void add(T l, T r){ st.insert(make_pair(l, r)); merge(); } void merge(){ auto itr = st.begin(); while(itr != st.end()){ T l1 = itr->first; T r1 = itr->second; ++itr; if(itr == st.end())break; T l2 = itr->first; T r2 = itr->second; if(l2 <= r1){ auto prev = itr; --prev; st.erase(itr); st.erase(prev); st.insert(make_pair(l1, max(r1, r2))); itr = st.lower_bound(make_pair(l1, max(r1, r2))); } } } auto begin() noexcept{ return st.begin(); } auto end() noexcept{ return st.end(); } size_t size(){ return st.size(); } }; int main(int argc, char const* argv[]) { ios_base::sync_with_stdio(false); cin.tie(0); int n; ll d, t; cin >> n >> d >> t; vector x(n); rep(i, n)cin >> x[i]; map > mp; rep(i, n){ ll tmp = x[i] % d + d; tmp %= d; mp[tmp].add(-t * d + x[i], t * d + x[i] + 1); } ll res = 0; for(auto itr = mp.begin(); itr != mp.end(); ++itr){ auto mrs = itr->second; for(auto i = mrs.begin(); i != mrs.end(); ++i){ ll range = (i->second - i->first - 1); res += range / d + 1; } } cout << res << endl; return 0; }