全列挙を無理矢理最適化して$O(N)$で通すやつをしたかったが、だめだったので$O(\frac{\mathrm{lcm}(a,b,c)}{\min(a,b,c)})$になってしまった。 i%a == 0 and i%b == 0 and i%c == 0で打ち切ればlcmが消せるが、気付くのが遅かったためこのまま。

#include <iostream>
typedef long long ll;
using namespace std;
template <typename T> T gcd(T a, T b) { while (a) { b %= a; swap(a, b); } return b; }
template <typename T> T lcm(T a, T b) { return (a * b) / gcd(a,b); }
int main() {
    int n, a, b, c; cin >> n >> a >> b >> c;
    ll l = lcm<ll>(a, lcm<ll>(b, c));
    int ans = 0;
    int x = -1; if (n/l) for (int i = 0; i < l+1;   i += min(a-i%a, min(b-i%b, c-i%c))) ++ x;
    int y = -1;          for (int i = 0; i < n%l+1; i += min(a-i%a, min(b-i%b, c-i%c))) ++ y;
    cout << (n/l)*x + y << endl;
    return 0;
}