Simmetriya#2588

Fermer John inəkləri hər sahənin tam ortasına yerləşdirir və prosesi dörd bərabər alt sahə üçün rekursiv olaraq təkrar edir:

  1. Mərkəzi hüceyrə yalnız sahənin hər iki tərəfi tək olan zaman mövcuddur.

  2. Əgər ən azı bir tərəf cüt olsa, proses dərhal dayanır.

  3. Əgər mərkəzi hüceyrə mövcuddursa, o zaman:

    • yalnız bir inək yerləşdirilir;

    • sahə eyni düzbucaqlıya bölünür;

    • proses hər birində müstəqil şəkildə təkrar edilir.

Qoy f(n, m) — n \times m sahədə yerləşdirilən inəklərin sayı olsun.

Əgər və ya ədədlərindən ən azı biri cüt ədəddirsə, mərkəzi hüceyrə mövcud deyildir. Buna görə

f(n, m) = 0

Əgər həm , həm də tək ədəddirsə, mərkəzə bir inək qoyuruq və daha sonra rekursiv olaraq , n / 2 \times m / 2 ölçüsündə dörd sahədə inəkləri yerləşdiririk:

f(n, m) = 1 + 4 \cdot f(n / 2, m / 2)

Nümunə

Verilmiş testi hesablayın.

f(7, 15) = 1 + 4 \cdot f(3, 7) = 1 + 4 \cdot 5 = 21 \\ f(3, 7) = 1 + 4 \cdot f(1, 3) = 1 + 4 \cdot 1 = 5 \\ f(1, 3) = 1 + 4 \cdot f(0, 1) = 1 + 4 \cdot 0 = 1

Alqoritmin icrası

f funksiyası n \times m ölçüsündə sahəyə yerləşdirilə bilən inəklərin sayını qaytarır.

long long f(int n, int m)
{
  if (n % 2 == 0 || m % 2 == 0) return 0;
  return 1 + 4 * f(n / 2, m / 2);
}

Programın əsas hissəsi. Daxil olan məlumatları oxuyun.

scanf("%d %d", &n, &m);

Hesablama aparır və cavabı çıxışa yazır.

res = f(n, m);
printf("%lld\n", res);

Java icrası

import java.util.*;

public class Main
{
  static long f(int n, int m) 
  {
    if (n % 2 == 0 || m % 2 == 0) return 0;
    return 1 + 4 * f(n/2, m/2);
  }
	
  public static void main(String[] args)
  {
    Scanner con = new Scanner(System.in);
    int n = con.nextInt();
    int m = con.nextInt();
    long res = f(n, m);
    System.out.println(res);
  }
}

Python icrası

f funksiyası n \times m ölçüsündə sahəyə yerləşdirilə bilən inəklərin sayını qaytarır.

def f(n, m):
  if n % 2 == 0 or m % 2 == 0: return 0
  return 1 + 4 * f(n // 2, m // 2)

Programın əsas hissəsi. Daxil olan məlumatları oxuyun.

n, m = map(int,input().split())

Hesablama aparır və cavabı çıxışa yazır.

res = f(n, m);
print(res)