Наивное решение:
n = int(input())
print(sum(filter(lambda x: x%7 != 0 and x%3 == 0, range(int(n**1. 5), n**2+1))))
Бахаем range в нужном диапазоне, фильтруем из него лямбдой числа по условию, складываем и выводим в консоль. Единственный нюанс, что n*sqrt(n) округляется вниз, что может быть проблемой, и тогда можно использовать math. ceil
Главным же минусом его является производительность при переборе "в лоб". На самом деле, решить задачку можно не за O(n^2), а за O(1), если вспомнить про сумму арифметической прогрессии, и про то, как надо вычитать прогрессии с взаимно простыми шагами
Нужно найти сумму прогрессии, попадающую в диапазон, с шагом 3, начиная с делящегося на 3 числа, и вычесть из неё сумму прогрессии с шагом 21, начиная с первого делящегося на 21 числа
Объясняется это тем, что каждое седьмое число из первой прогрессии будет делиться на 7, а раз оно делится и на 3 тоже, то это число, делящееся на 21
Выглядит страшно, но по факту здесь только задача в том, чтоб правильно округлить нижние границы диапазонов - from3 и from21 вверх, а верхние - to3 и to21 - вниз. Зато работает идеально быстро и вообще не зависит от размеров диапазонов (длинная арифметика не в счёт)
import math
n = int(input())
from3 = math. ceil(n**1. 5 / 3) * 3
from21 = math. ceil(n**1. 5 // 21) * 21
to3 = n**2 // 3 * 3
to21 = n**2 // 21 * 21
sum3 = (from3+to3)*((to3-from3)//3+1) // 2
sum21 = (from21+to21)*((to21-from21)//21+1) // 2
print(sum3 - sum21)