Əgər ədədi təkdirsə, onda f(n) = n.
Əgər ədədi cütdürsə, onda f(n) = f(n / 2).
Güman edək ki,
Təbii ədədlər çoxluğunu -dən -ə qədər iki altçoxluğa bölək:
ODD — tək ədədlər çoxluğu,
EVEN — cüt ədədlər çoxluğu.
-dən -ə qədər olan təbii ədədlər içərisində dəqiq olaraq:
k = \left\lfloor (n + 1) / 2 \right\rfloor tək ədədlər,
l = \left\lfloor n / 2 \right\rfloor cüt ədədlər vardır.
O zaman:
Eyni zamanda:
Rekursiyanın bitməsini təmin edək ki, g(0) = 0. Beləliklə,
Nümunə
İlk testi nəzərdən keçirək, harada n = 7.
-dən -ə qədər olan təbii ədədlər içərisində dəqiq olaraq:
k = \left\lfloor (7 + 1) / 2 \right\rfloor = 4 tək ədədlər,
l = \left\lfloor 7 / 2 \right\rfloor = 3 cüt ədədlər vardır.
Alqoritmin realizasiyası
g funksiyasını reallaşdırırıq.
long long g(long long n)
{
long long k = (n + 1) / 2;
if (n == 0) return 0;
return k * k + g(n / 2);
}Proqramın əsas hissəsi. Hər bir test üçün giriş dəyəri -ı oxuyur və -ı çıxarır.
while(scanf("%lld",&n) == 1)
printf("%lld\n",g(n));Java realizasiyası
import java.util.*;
public class Main
{
static long g(long n)
{
long k = (n + 1) / 2;
if (n == 0) return 0;
return k * k + g(n / 2);
}
public static void main(String[] args)
{
Scanner con = new Scanner(System.in);
while(con.hasNext())
{
long n = con.nextLong();
System.out.println(g(n));
}
}
}Python realizasiyası
g funksiyasını reallaşdırırıq.
def g(n):
if n == 0:
return 0
k = (n + 1) // 2
return k * k + g(n // 2)Proqramın əsas hissəsi. Hər bir test üçün giriş dəyəri -ı oxuyur və -ı çıxarır.
for line in sys.stdin:
n = int(line)
print(g(n))