1-dən 10^9-ə qədər bütün təbii ədədlərin kvadratlarını və kublarını yaradıb çoxluğunda saxlayacağıq. Təkrarlanan ədədlər avtomatik olaraq istisna edilir, çünki çoxluq təkrara icazə vermir. Sonra çoxluğun elementlərini massivinə kopyalayacağıq ki, bu da artıq artan sırada sıralanmış olacaq, çünki — sıralanmış çoxluqdur.
Daha sonra hər bir giriş ədədi üçün ikili axtarış vasitəsilə -dən çox olmayan kvadratlar və kubların sayını təyin edəcəyik. Bunun üçün yuxarı sərhədə (upper\_bound) görə axtarışdan istifadə edəcəyik — bu massivində -dən ciddi şəkildə böyük olan ilk elementi göstərəcək. Bu mövqe sorğunun cavabı olacaq, çünki bu uyğun nömrələrin sayına uyğundur.
Misal
-dən -ə qədər (daxil olmaqla) ədədlərin kvadratlarını və kublarını yaradacağıq.
Sorğunu n = 30 üçün icra edək. Bu halda tapılan mövqe pos = 7 olacaq, yəni -dən -a qədər olan aralıqda dəqiq olaraq uyğun ədəd var. Yadda saxlayaq ki, massivində indeksləmə sıfırdan başlayır.
Əlgoritmin həyata keçirilməsi
1-dən 10^9-ə qədər bütün təbii ədədlərin kvadratlarını və kublarını yaradıb çoxluğunda saxlayacağıq. Əgər ədəd eyni zamanda həm kvadrat, həm də kubdursa (məsələn, ), bu yalnız bir dəfə çoxluğa əlavə ediləcək, çünki çoxluqlar təkrarlamaları avtomatik olaraq aradan qaldırır.
for (i = 1; i * i <= 1000000000; i++)
s.insert(i * i);
for (i = 1; i * i * i <= 1000000000; i++)
s.insert(i * i * i);Sonra çoxluğun elementlərini massivinə köçürəcəyik. Çünki çoxluğu sıralanmışdır, massivi də artan sıra ilə sıralanacaq.
v = vector<int>(s.begin(), s.end());Ardıcıl olaraq testlərini işləyəcəyik.
scanf("%d", &tests);
while (tests--)
{
scanf("%d", &n);Yuxarı sərhədə görə ikili axtarış vasitəsilə kiçik indeksini tapırıq ki, -dən çox olmayan bütün təbii ədədlərin kvadratları və kubları -dan pos - 1-ə qədər mövqelərdə yerləşir. Bu şəkildə -dən -ə qədər olan ədədlərin sayı ilə eynidir.
res = upper_bound(v.begin(), v.end(), n) - v.begin();
printf("%d\n", res);
}