TopCoder SRM 672 Div1 Easy: Procrastination

解法

n-200からn+200までの数の約数を全列挙して殴る。

コード

import java.util.Arrays;
import java.util.HashSet;

public class Procrastination {

    public long findFinalAssignee(long n) {
	HashSet<Long> divisers = new HashSet<>();
	long min = Math.max(2, n - 200);
	long max = n + 200;
	int sqrt = (int) Math.sqrt(max);
	for (int i = 2; i <= sqrt; i++) {
	    for (long num = min; num <= max; num++) {
		if (num < i) {
		    continue;
		}
		if (num % i == 0) {
		    divisers.add((long) i);
		    if (num / i >= 2) {
			divisers.add(num / i);
		    }
		}
	    }
	}
	Long[] d = divisers.toArray(new Long[divisers.size()]);
	Arrays.sort(d);
	for (long p : d) {
	    if (n - 1 <= p) {
		break;
	    }
	    if (n > p && n % p == 0) {
		n++;
	    } else if ((n - 1) > p && (n - 1) % p == 0) {
		n--;
	    }
	}

	return n;
    }

}