Alqoritm Analizi
Funksiya , [1; ] aralığında və ya -yə bölünən təbii ədədlərin sayını hesablasın. Bu say aşağıdakıya bərabərdir:
Axtarılan -ci ədəd olsun. Onda , olacaq ən kiçik təbii ədəd olmalıdır. Biz onu ikili axtarışla tapacağıq, başlanğıc intervalı [; ] = [1; ] olaraq götürəcəyik. = ( + ) / 2 olsun. Əgər isə, axtarış [; ] intervalında davam etməlidir, əks halda – [ + 1; ] intervalında.
Nümunə
Birinci nümunəni nəzərdən keçirək, burada , . olan ən kiçik -i tapmaq lazımdır. Bəzi dəyərləri hesablayaq:
tənliyinin ən kiçik həlli olacaq.
Alqoritm Tətbiqi
ƏBOB və ƏKOB hesablamaq üçün funksiyalar.
long long gcd(long long a, long long b) { return (b == 0) ? a : gcd(b, a % b); } long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }
Funksiya , -dən kiçik və ya ona bərabər olan təbii ədədlərin sayını qaytarır ki, bu ədədlər ya -ya, ya da -yə bölünür.
long long f(long long n) { return n / a + n / b - n / lcm(a, b); }
Giriş məlumatlarını oxu.
scanf("%lld %lld %lld", &a, &b, &n);
İkili axtarışa başla. olan ən kiçik dəyərini tap.
left = 1; right = 1e9; while (left < right) { middle = (left + right) / 2; if (f(middle) >= n) right = middle; else left = middle + 1; }
Cavabı çap et.
printf("%lld\n", left);
Java Tətbiqi
import java.util.*; import java.io.*; public class Main { static long gcd(long a, long b) { return (b == 0) ? a : gcd(b, a % b); } static long lcm(long a, long b) { return a / gcd(a, b) * b; } static long f(long n, long a, long b) { return n / a + n / b - n / lcm(a, b); } public static void main(String[] args) { FastScanner con = new FastScanner(new InputStreamReader(System.in)); long a = con.nextInt(); long b = con.nextInt(); long n = con.nextInt(); long left = 1, right = 1000000000; while (left < right) { long middle = (left + right) / 2; if (f(middle, a, b) >= n) right = middle; else left = middle + 1; } System.out.println(left); } } class FastScanner { private BufferedReader br; private StringTokenizer st; public FastScanner(InputStreamReader reader) { br = new BufferedReader(reader); } public String next() { while (st == null || !st.hasMoreTokens()) { try { st = new StringTokenizer(br.readLine()); } catch (Exception e) { e.printStackTrace(); } } return st.nextToken(); } public int nextInt() { return Integer.parseInt(next()); } public void close() throws Exception { br.close(); } }