UVA 1649

来源:互联网 发布:php mysql 三表联查 编辑:程序博客网 时间:2024/06/05 09:15

    就算是C++选手在ACM中如果使用Java,我觉得大多数都是因为看重其大数与高精度了,Java中的BigInteger和BigDecimal简直就是bug的存在,回归正题。本题就属于大数题,说是大数,也不能太依赖。

    由于给出的数据范围可以的出k应该是不会大于35的。可以通过枚举每一个k然后二分出n得到答案。请无视我代码中变量的名字,看起来很乱,但是当时变量太多,也不知道去什么好了。注意最后的格式,不要PE。

    代码如下

/*author by  * nightmare */import java.math.BigInteger;import java.util.*;public class uva1649 {public static void main(String[] args) {int maxk = 35;BigInteger factor[] = new BigInteger[maxk];factor[0] = BigInteger.ONE;Set<Long> set = new TreeSet<Long>();for (int i = 1; i < maxk; i++) {factor[i] = factor[i - 1].multiply(BigInteger.valueOf(i));}Scanner scan = new Scanner(System.in);int Case = scan.nextInt();for (int cases = 1; cases <= Case; cases++) {BigInteger m = scan.nextBigInteger();for (int k = 1; k < maxk; k++) {BigInteger a = m.multiply(factor[k]);long l = k;long r = 1000000000000001L;while (l < r) {long mid = (l + r) >> 1;BigInteger init = BigInteger.ONE;for (int c = 0; c < k; c++) {init = init.multiply(BigInteger.valueOf(mid - c));if (init.compareTo(a) == 1) {break;}}// System.out.println(k + " " + l + " " + r + " " + init);if (init.compareTo(a) == -1) {l = mid + 1;} else if (init.compareTo(a) == 0) {set.add(mid);// System.out.println(mid);break;} else {r = mid;}}}long zzz[] = new long[set.size()];Iterator Iterator = set.iterator();int qqqqqq = 0;while (Iterator.hasNext()) {// System.out.print(Iterator.next());zzz[qqqqqq] = (long) Iterator.next();qqqqqq++;}// for(int i = 0;i<set.size();i++){// System.out.print(zzz[i]+" ");// }long[] ansk = new long[zzz.length * 2];long[] ansn = new long[zzz.length * 2];int count = 0;for (int i = 0; i < zzz.length; i++) {long nnnnn = zzz[i];BigInteger xxxxxx = BigInteger.ONE;for (int k = 1; k <= maxk; k++) {xxxxxx = xxxxxx.multiply(BigInteger.valueOf(nnnnn - k + 1)).divide(BigInteger.valueOf(k));if (xxxxxx.compareTo(m) == 1) {break;}if (xxxxxx.compareTo(m) == 0) {ansn[count] = nnnnn;ansk[count] = k;count++;if (k * 2 < nnnnn) {ansn[count] = nnnnn;ansk[count] = nnnnn - k;count++;}break;}}}System.out.println(count);for (int i = 0; i < count; i++) {if (i == count - 1)System.out.println("(" + ansn[i] + "," + ansk[i] + ")");elseSystem.out.print("(" + ansn[i] + "," + ansk[i] + ") ");}}}}




0 0
原创粉丝点击