Найти количество пар чисел от 1 до n и от 1 до m, таких чтобы 1 ≤ x ≤ n, 1 ≤ y ≤ m и (x + y) mod 5 = 0;

Найти количество пар чисел от 1 до n и от 1 до m, таких чтобы 1  ≤ x  ≤  n, 1 ≤ y  ≤  m и (x + y) % 5 = 0. Предпринимал такую попытку решения:

ll count_mod(ll num, ll mod) {
    return num / 5 + (num % 5 >= mod);
}
int main() {
    ll n, m;
    cin >> n >> m;
    ll countn[5] = {
        count_mod(n, 0),
        count_mod(n, 1),
        count_mod(n, 2),
        count_mod(n, 3),
        count_mod(n, 4)
    };
    ll countm[5] = {
        count_mod(m, 0),
        count_mod(m, 1),
        count_mod(m, 2),
        count_mod(m, 3),
        count_mod(m, 4)
    };
    cout <<
        countn[0] * countm[0] + 
        countn[1] * countm[4] + 
        countn[2] * countm[3] + 
        countn[3] * countm[2] + 
        countn[4] * countm[1] 
       << "\n";
    return 0;
}

Но он не проходит все тесты.


Ответы (1 шт):

Автор решения: Harry

Берем num = 1, mod = 0.

Что должно получиться? Верно, 0: нет ни одного числа, которое дает в остатке 0 при делении на 5.

А по вашей формуле что?

0/5 + (1%5 >= 0) = 0 + (1 >= 0) = 1

Дальше пояснять не надо?

P.S. простейшая реализация:

int count_mod(int num, int mod)
{
    return std::max(0,int(floor((num-mod)/5.) - ceil((1-mod)/5.)+1));
}

Если ограничиться только целочисленными операциями, то

int count_mod(int n, int m)
{
    if (m > n) return 0;
    int first = (m >= 1) ? m : m + 5;
    if (first > n) return 0;
    int last = n - (n - m) % 5;
    if (last < first) return 0;
    return (last - first) / 5 + 1;
}
→ Ссылка