[Neerc2015] Binary vs Decimal(java大数 + 找规律)

题目大意是有一种数,它的二进制形式的后几位刚好是它自己。

比如100的二进制形式是1100100,1100100的末尾三个数刚好是100,就符合条件,求第n个符合条件的数。

序列在oeis A181891。

做法的话先是发现这样的数的后缀一定在之前出现过,然后可以bfs一下。

更简单的做法是发现一个规律,就是符合条件的数的二进制形式比如100的1100100,如果把1100100当成十进制在转换为二进制的话得到100001100100101000100,末尾依然是100,这样的话我们检查1100100的二进制末尾是不是100(通过位运算)就可以判断是不是符合条件的数,这一块的复杂度降下来以后就可以暴力搞了,配上java大数简直酸爽。

 

import java.util.*;
import java.math.*; 
import java.io.*;
public class Main {
    static BigInteger[] a, b;
    static PrintStream out;
    public static void main(String[] args) throws IOException{
        Scanner sc = new Scanner(new File("binary.in"));
        out = new PrintStream(new FileOutputStream(new File("binary.out")));
        int n = sc.nextInt();
        a = new BigInteger[n*3];
        b = new BigInteger[n*3];
        int m = 2;
        BigInteger Pow10 = BigInteger.valueOf(1);
        a[0] = b[0] = BigInteger.valueOf(0);
        a[1] = b[1] = BigInteger.valueOf(1);
        int i, j;
        for(i = 1; m <= n; i++){
            Pow10 = Pow10.multiply(BigInteger.valueOf(10));
            int t = m;
            for(j = 0; j < t; j++){
                BigInteger ta, tb;
                ta = a[j].add(BigInteger.ONE.shiftLeft(i));
                tb = b[j].add(Pow10);
                if(ta.xor(tb).and(
                        BigInteger.ONE.shiftLeft(i+1).subtract(BigInteger.ONE)
                        ).equals(BigInteger.ZERO)){
                    a[m] = ta;
                    b[m] = tb;
                    m++;
                }
            }
        }
        out.println(a[n].toString(2));
    }
}

 

posted @ 2016-07-19 10:41  MartinEden  阅读(415)  评论(0编辑  收藏  举报