#include <algorithm>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
// Maximum value of f for arguments <= 10e18
static const uint64_t MAX_F = 81 * 17;
inline uint64_t f(uint64_t n)
{
int ret = 0;
while (n > 0)
{
int digit = int(n % 10);
ret += digit * digit;
n /= 10;
}
return uint64_t(ret);
}
int solve(uint64_t k, uint64_t a, uint64_t b)
{
const uint64_t start = (a + k - 1) / k;
const uint64_t end = std::min(b / k, MAX_F) + 1;
int count = 0;
for (uint64_t i = start; i < end; i++)
{
uint64_t n = i * k;
if (k * f(n) == n)
count++;
}
return count;
}
int main()
{
uint64_t k, a, b;
scanf("%lld %lld %lld", &k, &a, &b);
int result = solve(k, a, b);
printf("%d\n", result);
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #include <algorithm> #include <cstdint> #include <cstdio> #include <cstdlib> // Maximum value of f for arguments <= 10e18 static const uint64_t MAX_F = 81 * 17; inline uint64_t f(uint64_t n) { int ret = 0; while (n > 0) { int digit = int(n % 10); ret += digit * digit; n /= 10; } return uint64_t(ret); } int solve(uint64_t k, uint64_t a, uint64_t b) { const uint64_t start = (a + k - 1) / k; const uint64_t end = std::min(b / k, MAX_F) + 1; int count = 0; for (uint64_t i = start; i < end; i++) { uint64_t n = i * k; if (k * f(n) == n) count++; } return count; } int main() { uint64_t k, a, b; scanf("%lld %lld %lld", &k, &a, &b); int result = solve(k, a, b); printf("%d\n", result); return 0; } |
English