Gəlin, və sabit olduğu halda -dən olan üçün f(i, j) = i / n - j / m ifadəsinin hansı qiymətləri ala biləcəyinə baxaq. Məsələn, f(n, m) = n / n - m / m = 0.
Məsələn, f(i, j) = i / 3 - j / 5 funksiyasını nəzərdən keçirək. Onda
Genişlənmiş Evklid alqoritminə görə həmişə belə tam və var ki, i / 3 - j / 5 = 1. Deməli, bu ifadənin ala biləcəyi ən kiçik müsbət dəyər -dir. Bundan çıxır ki, bu ifadə şəklində bütün mümkün dəyərləri ala bilər, burada k \in Z.
Teorem. Əgər f(i, j) = i / n - j / m-dirsə, onda bu funksiya k / EKQ(n, m) şəklindəki dəyərləri alır, burada k \in Z.
Sübut. Doğrudan da,
Çünki m / EBOB(n, m) və n / EBOB(n, m) ədədləri qarşılıqlı sadədir, həmişə belə və var ki, kəsrin surəti -ə bərabər olsun. Deməli, f(i, j) funksiyası k / EKQ(n, m) şəklindəki bütün mümkün dəyərləri ala bilər, burada k \in Z.
İndi orijinal funksiyanı nəzərdən keçirək
Onun qiymətləri nöqtəsindən k / EKQ(n, m), k \in Z şəklindəki ən yaxın nöqtəyə olan məsafələrdir. Funksiyanın maksimumlaşdırılması üçün dəyərini seçmək lazımdır ki, bu dəyər k / EKQ(n, m) və (k + 1) / EKQ(n, m) arasında dəqiq mərkəzdə olsun, burada tam ədəddir. Bu nöqtədə funksiyanın qiyməti 1 / 2 \cdot EKQ(n, m)-ə bərabərdir ki, bu da cavab olacaq.
Misal
Qoy f(t) = min_{i,j \in Z} |{i \over 3} - {j \over 5} + t| olsun. Aşkar ki, f(0) = 0. f(1 / 15) = 0 bərabərliyi doğru olduğu halda, belə və var ki, i / 3 - j / 5 = -1 / 15 (məsələn, i = 1, j = 2). Bu, həmçinin f(k / 15) = 0 olduğu halda, bu k \in Z-dir.
Ancaq f(k / 15 + 1 / 30) = 1 / 30, və bu funksiyanın olabiləcəyi ən yüksək qiymətdir, çünki k / 15 + 1 / 30 nöqtəsi funksiyanın null nöqtələrindən maksimal məsafədə yerləşir.
Alqoritm yerişinə dair
gcd funksiyası və ədədlərinin ən böyük ortaq böləni tapır.
long long gcd(long long a, long long b)
{
return b == 0 ? a : gcd(b, a % b);
}lcm funksiyası və ədədlərinin ən kiçik ortaq katını tapır.
long long lcm(long long a, long long b)
{
return a / gcd(a, b) * b;
}Proqramın əsas hissəsi. Giriş məlumatlarını oxuyuruq.
while (scanf("%lld %lld", &n, &m) == 2)
{Cavabı hesablayır və çıxarırıq.
d = 2 * lcm(n, m);
printf("%lld/%lld\n", 1, d);
}