Bölənlərin cəmi#1782

Bölənlərin cəmi (Həll təhlili)

Funksiyalı nəzərdən keçirək ki, bu funksiyanın müsbət tamsayı üçün bütün müsbət bölənlərinin cəmini qaytarır.

σ(n) = 1 + p
1, p, p^2, ..., p^a

Onların cəmi geometrik ardıcıllıq təşkil edir, bu səbəbdən:

σ(p^a) = 1 + p + p^2 + p^3 + ... + p^a = \frac{p^{a+1} - 1}{p - 1}

Funksiyası multiplikativdir, yəni istənilən qarşılıqlı sadə ədədlər və üçün aşağıdakı bərabərlik doğru olur:

σ(xy) = σ(x) σ(y)

Təbii ədəd -in sadə bölənlərə ayrılması:

n = p_1^{a_1} p_2^{a_2}...p_k^{a_k},

burada p_1, p_2, ..., p_k müxtəlif sadə ədədlərdir.

Bu zaman, multiplikativliyindən və sadə ədədlərin qüvvətləri üçün formuldan istifadə edərək əldə edirik:

σ(n) = σ(p_1^{a_1}) \cdot σ(p_2^{a_2}) \cdot ... \cdot σ(p_k^{a_k}) = \frac{p_1^{a_1+1}-1}{p_1-1} \cdot \frac{p_2^{a_2+1}-1}{p_2-1} \cdot ... \cdot \frac{p_k^{a_k+1}-1}{p_k-1}

Göstərilən cəm bu formada da yazıla bilər:

\sigma(n) = \prod_{i=1}^{k} \frac{p_i^{a_i+1} - 1}{p_i - 1} = \prod_{i=1}^{k} \left( 1 + p_i + p_i^2 + \dots + p_i^{a_i} \right) = \prod_{i=1}^{k} \sum_{j=0}^{a_i} p_i^{\,j}.

Nümunə

Ədəd n = 239 sadədir, yəni düz iki müsbət bölənə malikdir: və . Bölənlərin cəmi funksiyasının tərifinə əsasən əldə edirik:

σ(239) = 1 + 239 = 240

Ədəd n = 24 nəzərdən keçirək. Onun sadə bölənlərə ayrılması:

24 = 2^3 \cdot 3

2^3 və arasında qarşılıqlı sadə olduğu üçün funksiyasının multiplikativliyindən istifadə edə bilərik:

σ(24) = σ(2^3) \cdot σ(3) = (1 + 2 + 4 + 8) \cdot (1 + 3) = 15 \cdot 4 = 60.

Ədəd n = 24 üçün bölənlərin cəmini birbaşa hesablayaq. 24-nin bütün müsbət bölənlərini sadalayaq:

1, 2, 3, 4, 6, 8, 12, 24

Onları toplayaq:

σ(24) = 1 + 2 + 3 + 4 + 6 + 8 + 12 + 24

Fərqinə varın ki, bütün bölənlər aşağıdakı şəkildə qruplaşdırıla bilər:

σ(24) = \\ 1 + 2 + 3 + 4 + 6 + 8 + 12 + 24 = \\ 1 + 2 + 4 + 8 + 3 \cdot (1 + 2 + 4 + 8) = \\ (1 + 2 + 4 + 8) \cdot (1 + 3) = 15 * 4 = 60

Alqoritmin həyata keçirilməsi

Giriş dəyəri -i oxuyuruq.

scanf("%lld",&n);

dəyişənində funksiyanın qiymətini hesablayırıq.

res = 1;

Dəyişən -də ədədinin bütün sadə bölənlərini (məsələ şərtlərinə görə 1000-dən kiçikdir) sınaqdan keçiririk. İmtina olunan formada, məsələnin analisində sadə bölənlərin hər biri üçün bölənlərin cəminə töhfə hesablanır.

for (i = 2; i <= 1000; i++)
{
  p = i;

Düz dəyişənində ədədinin sadə bölənini qəbul edirik. i^a-nin -ni bölən olduğunu tapmaq üçün ən böyük qüvvət -ı tapaq.

  while(n % i == 0)
  {
    n /= i; 
    p *= i;
  }

Dövrün bitimindən sonra p = i^{a+1} alırıq. Sonra dəyişəninin cari dəyərini \frac{i^{a + 1} - 1}{i - 1} ilə vururuq.

  res *= (p - 1) / (i - 1);
}

Cavabı ekrana yazırıq.

printf("%lld\n",res);

Java-da həyata keçirilməsi

import java.util.*;

class Main
{
  public static void main(String[] args)
  {
    Scanner con = new Scanner(System.in);
    long n = con.nextLong();
    long res = 1;
    for(int i = 2; i <= 1000; i++)
    {
      long p = i;
      while(n % i == 0)
      {
        n /= i; 
        p *= i;
      }
      res *= (p - 1) / (i - 1);
    }

    System.out.println(res);
    con.close();
  }
}

Python-da tətbiqi

Giriş dəyəri -i oxuyuruq.

n = int(input())

Dəyişən -də funksiyanı hesablayırıq.

res = 1

Dəyişən -də ədədinin bütün sadə bölənlərini (məsələ şərtlərinə görə 1000-dən kiçikdir) sınaqdan keçiririk. Məsələnin analizinin nümayiş etdirdiyi səhər forması üçün sadə bölənin hər biri üçün bölənlərin cəminə töhfə hesablanır.

for i in range (2,1000) :
  p = i

Dəyişənləri düz pencərədə ədədinini qəbul edirik və sonra i^a-nin -ni bölən olduğunu tapmaq üçün ən böyük qüvvət -ı tapaq.

  while(n % i == 0) :
    n = n // i 
    p *= i

Dövrün bitimindən sonra p = i^{a+1} alırıq. Sonra -i \frac{i^{a + 1} - 1}{i - 1} ilə vururuq.

  res *= (p - 1) // (i - 1) 

Cavabı ekrana yazırıq.

print(res)