Guest User

Untitled

a guest
Jul 11th, 2013
340
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.35 KB | None | 0 0
  1. package WF2013;
  2. import java.io.BufferedReader;
  3. import java.io.InputStreamReader;
  4. import java.io.PrintWriter;
  5. import java.math.BigInteger;
  6. import java.util.ArrayList;
  7. import java.util.HashMap;
  8. import java.util.List;
  9. import java.util.Map;
  10.  
  11. public class Factors {
  12.     static BigInteger MAX = BigInteger.valueOf(2).pow(63);
  13.     static List<Integer> primes;
  14.     static Map<BigInteger, BigInteger> ansMap;
  15.     static BigInteger[] fac;
  16.    
  17.     public static void main(String[] args) throws Exception{
  18.         BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
  19.         PrintWriter out = new PrintWriter(System.out);
  20.         primes = getPrimes(62);
  21.        
  22.         fac = new BigInteger[63];
  23.         fac[0] = BigInteger.ONE;
  24.         for(int i = 1; i < fac.length; i++){
  25.             fac[i] = fac[i-1].multiply(BigInteger.valueOf(i));
  26.         }
  27.        
  28.         ansMap = new HashMap<BigInteger, BigInteger>();
  29.         count(62, Integer.MAX_VALUE, BigInteger.ONE, 0, new ArrayList<Integer>());
  30.         String line = in.readLine();
  31.         while(line != null){
  32.             BigInteger n = new BigInteger(line);
  33.             out.println(n + " " + ansMap.get(n));
  34.             line = in.readLine();
  35.         }
  36.        
  37.         out.close();
  38.     }
  39.  
  40.     //count the number of ways to throw pebbles if I have pebLeft pebbles, and previously I threw prev
  41.     //I don't need to consume all the pebbles. Pebbles have to be in decreasing order
  42.     //count(m,n) = if I throw i pebbles right now.
  43.     //curPrimeIndex = current pebble weight
  44.     static void count (int pebLeft, int prev, BigInteger cur, int curPrimeIndex, List<Integer> history){
  45.         if(pebLeft == 0){
  46.             store(history, cur);
  47.         }else{
  48.             int maxThrow = Math.min(pebLeft, prev);
  49.             //if I throw 0.. ends now
  50.             store(history, cur);
  51.             BigInteger newCur = cur;
  52.             BigInteger curPrime = BigInteger.valueOf(primes.get(curPrimeIndex));
  53.             for(int start = 1; start <= maxThrow; start++){
  54.                 newCur = newCur.multiply(curPrime);
  55.                 if(newCur.compareTo(MAX) >= 0)
  56.                     break;
  57.                 history.add(start);
  58.                 count(pebLeft - start, start, newCur, curPrimeIndex+1, history);
  59.                 history.remove(history.size()-1);
  60.             }
  61.         }
  62.     }
  63.    
  64.     static void store(List<Integer> history, BigInteger smallestK){
  65.         if(history.size() == 0)return;
  66.         int num = 0;
  67.         for(int  i : history) num += i;
  68.         BigInteger ans = fac[num];
  69.         for(int i : history){
  70.             ans = ans.divide(fac[i]);
  71.         }
  72.         if(ansMap.containsKey(ans)){
  73.             BigInteger prevK = ansMap.get(ans);
  74.             if(smallestK.compareTo(prevK) < 0){
  75.                 ansMap.put(ans, smallestK);
  76.             }
  77.         }else{
  78.             ansMap.put(ans, smallestK);
  79.         }
  80.     }
  81.    
  82.     //n=max num to be considered
  83.     public static List<Integer> getPrimes(int N){
  84.         boolean[] isPrime = new boolean[500];
  85.         List<Integer> primes = new ArrayList<Integer>();
  86.         for (int i = 2; i < 500; i++) {
  87.             isPrime[i] = true;
  88.         }
  89.        
  90.         int lastI = 0;
  91.         for (int i = 2; i*i < 500; i++) {
  92.             if (isPrime[i]) {
  93.                 primes.add(i);
  94.                 if(primes.size() >= N){
  95.                     return primes;
  96.                 }
  97.                 for (int j = i; i*j < 500; j++) {
  98.                     isPrime[i*j] = false;
  99.                 }
  100.             }
  101.             lastI = i;
  102.         }
  103.        
  104.         for(int i = lastI+1; i < isPrime.length; i++){
  105.             if(isPrime[i]){
  106.                 primes.add(i);
  107.                 if(primes.size() >= N){
  108.                     return primes;
  109.                 }
  110.             }
  111.         }
  112.  
  113.         return primes;
  114.     }
  115. }
Advertisement
Add Comment
Please, Sign In to add comment