Monday, January 2, 2017

UVa 10880 - Colin and Ryan


// UVa 10880 - Colin and Ryan
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {

		try (Scanner scanner = new Scanner(System.in)) {
			int cases = scanner.nextInt();
			for (int caseNumber = 1; caseNumber <= cases; caseNumber++) {

				int C = scanner.nextInt();
				int R = scanner.nextInt();

				if (R == C) {
					System.out.printf("Case #%d: 0\n", caseNumber);
					continue;
				}

				List<Integer> factors = getAllFactors(C - R);
				int index = getInsertionPoint(R, factors);

				System.out.printf("Case #%d:", caseNumber);
				for (int i = index; i < factors.size(); i++)
					System.out.printf(" %d", factors.get(i));
				System.out.printf("\n");
			}
		}

	}

	private static List<Integer> getAllFactors(int n) {
		int limit = (int) Math.sqrt(n);
		List<Integer> factors = new ArrayList<>();
		for (int d = 1; d < limit; d++) {
			if (n % d == 0) {
				factors.add(d);
				factors.add(n / d);
			}
		}
		if (n % limit == 0) {
			factors.add(limit);
			if (n / limit != limit)
				factors.add(n / limit);
		}

		Collections.sort(factors);
		return factors;
	}

	private static int getInsertionPoint(int R, List<Integer> factors) {
		int index = Collections.binarySearch(factors, R);
		if (index >= 0 && factors.get(index) == R)
			index++;
		else
			index = -(index + 1);
		return index;
	}
}

No comments:

Post a Comment