#include<algorithm> #include<cmath> #include<iostream> #include<unordered_map> #include<vector> using i64 = longlong; using vi = std::vector<int>; constexprint N = 1e7 + 5;
vi G[N]; i64 n; std::vector<i64> v; std::unordered_map<i64, int> mp; int mark[10];
i64 get_num(i64 a, i64 b, i64 c, i64 d){ return std::pow(2ll, a) * std::pow(3ll, b) * std::pow(5ll, c) * std::pow(7ll, d); }
intmain(){ std::cin >> n;
for (i64 a = 1; a <= n; a *= 2) { for (i64 b = 1; b <= n; b *= 3) { for (i64 c = 1; c <= n; c *= 5) { for (i64 d = 1; d <= n; d *= 7) { i64 x = a * b * c * d; if (x <= n) v.push_back(x); } } } }
for (int i = 0; i < v.size(); i++) mp[v[i]] = i; for (int i = 0; i < 10; i++) mark[i] = -1;
for (int i = 0; i < v.size(); i++) { i64 x = v[i]; while (x > 0) { mark[x % 10] = i; x /= 10; }
for (int j = 2; j <= 9; j++) { if (mark[j] != i || v[i] % j != 0 || !mp.count(v[i] / j)) continue; G[mp[v[i] / j]].push_back(mp[v[i]]); } }
int ans = 0; vi vis(v.size(), false); auto dfs = [&](auto F, int u) -> void { vis[u] = true; ans++; for (int v : G[u]) if (!vis[v]) F(F, v); };