本文主要是介绍【GoogleCodeJam2016C】【java 二进制枚举爆搜】Coin Jam n位01数转变为n进制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
import java.util.*;
import java.math.*;
public class Main
{static Scanner cin = new Scanner(System.in);public static void main(String[] args){//预处理素数int prime[] = { 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101 };BigInteger Prime[] = new BigInteger[26];for (int i = 0; i<26; ++i)Prime[i] = BigInteger.valueOf(prime[i]);//预处理幂次BigInteger v0 = BigInteger.valueOf(0);BigInteger v1 = BigInteger.valueOf(1);BigInteger pow[][] = new BigInteger[12][32];for (int i = 2; i <= 10; ++i){pow[i][0] = v1;for (int j = 1; j<32; ++j)pow[i][j] = pow[i][j - 1].multiply(BigInteger.valueOf(i));}//暴力枚举int a[] = new int[32];int ans[] = new int[12];int n = 32;int m = 500;int cnt = 0;for (int sta = 1;; sta += 2){int len = 0;for (int tmp = sta; tmp>0; tmp >>= 1)a[len++] = tmp & 1;boolean ok = true;for (int i = 2; i <= 10; ++i){BigInteger bas = pow[i][n - 1];for (int p = 0; p<len; ++p)if (a[p] == 1)bas = bas.add(pow[i][p]);boolean flag = false;for (int j = 0; j<26; ++j)if (bas.mod(Prime[j]) == v0){ans[i] = prime[j];flag = true;break;}if (!flag){ok = false;break;}}if (ok){System.out.print("1");for (int i = n - 2; i >= len; --i)System.out.print("0");for (int i = len - 1; i >= 0; --i)System.out.print(a[i]);for (int i = 2; i <= 10; ++i)System.out.print(" " + ans[i]);System.out.println();if (++cnt == m)break;}}}
}
/*
【题意】
有一个二进制数(具体未知),位数为n(n>=2),
其最高位和最低位都为1,
我们把这个二进制数当做2~10进制的数,然后转变为二进制数。
如果这个数在2~10的所有进制下,都不是素数,那么得到一个合法目标数,
让你构造m个合法目标数。【类型】
二进制枚举爆搜【分析】
答案很普遍,直接暴力~*/
这篇关于【GoogleCodeJam2016C】【java 二进制枚举爆搜】Coin Jam n位01数转变为n进制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!