Stepan və cütlüklər#4283

Stepan və cütlüklər (Həll təhlili)

-ni sabit edək (məsələn j = 12) və i = \text{ƏBOB}(i, 12) olan belə -lərin sayını tapaq. Bu bərabərliyi ödəyən qiymətlərini tapaq. Bunlar i = 1, 2, 3, 4, 6, 12 olacaq. Yəni -nin böləni olan istənilən , i = \text{ƏBOB}(i, 12) bərabərliyini ödəyir.

i = \text{ƏBOB}(i, j) olan belə -lərin sayı ədədinin bölənlərinin sayına, yəni -yə bərabərdir. 1 \le j \le n olduğundan, -dən -ə qədər olan ədədlərin bütün bölənlərinin sayını tapmaq qalır. Yəni aşağıdakı cəmi tapmaq lazımdır

d(1) + d(2) + ... + d(n)

-in hesablanması ədədinin faktorizasiyasını tələb etdiyindən, göstərilən cəmin birbaşa hesablanması vaxt tələb edəcək.

Bölənlərin cəminə başqa cür baxaq. -dən -ə qədər olan ədədlərin bölənləri arasında bir \lfloor{n \over 1}\rfloor dəfə, iki \lfloor{n \over 2}\rfloor dəfə və s. rast gələcək (yəni böləni \lfloor{n \over i}\rfloor dəfə rast gələcək). Axtarılan tam ədəd cütlərinin sayı bərabərdir

\sum_{i=1}^n \left\lfloor \frac{n}{i} \right\rfloor

Göstərilən cəmi vaxt ərzində tapmaq olar.

Misal

n = 6 olduqda aşağıdakı cütləri əldə edirik:

Cütlərin sayı bərabərdir

6 / 1 + 6 / 2 + 6 / 3 + 6 / 4 + 6 / 5 + 6 / 6 = \\ = 6 + 3 + 2 + 1 + 1 + 1 = 14

Alqoritmin realizasiyası

qiymətini oxuyuruq.

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

Cavabı düstur üzrə hesablayırıq və çap edirik.

s = 0;
for (i = 1; i \<= n; i++)
  s += n / i;
printf("%d\n",s);

Java realizasiyası

import java.util.*;

class Main
{
  public static void main(String[] args)
  {
    Scanner con = new Scanner(System.in);
    int n = con.nextInt();
    int s = 0;
    for(int i = 1; i \<= n; i++)
      s += n / i;
    System.out.println(s);
    con.close();
  }
}

Python realizasiyası

qiymətini oxuyuruq.

n = int(input())

Cavabı düstur üzrə hesablayırıq və çap edirik.

s = 0
for i in range(1,n+1):
  s += n // i
print(s)