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.
Əgər n = p və sadə ədəddirsə, onda -in düz iki böləni var: və . Nəticədə:
Əgər n = p^a, burada sadə ədəddir və a \ge 1, -in bütün bölənləri:
Onların cəmi geometrik ardıcıllıq təşkil edir, bu səbəbdən:
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:
Təbii ədəd -in sadə bölənlərə ayrılması:
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:
Göstərilən cəm bu formada da yazıla bilər:
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:
Ədəd n = 24 nəzərdən keçirək. Onun sadə bölənlərə ayrılması:
2^3 və arasında qarşılıqlı sadə olduğu üçün funksiyasının multiplikativliyindən istifadə edə bilərik:
Ə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:
Onları toplayaq:
Fərqinə varın ki, bütün bölənlər aşağıdakı şəkildə qruplaşdırıla bilər:
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 = 1Də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 = iDə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 *= iDö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)