Guest User

Untitled

a guest
Apr 24th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.83 KB | None | 0 0
  1. Data provided by Pastebin.com - Download Raw
  2. import java.util.*;
  3. import java.math.*;
  4.  
  5. public class PrimeCompositeGame {
  6.         boolean [] primes;
  7.         int [] dif;
  8.    public int theOutcome(int N, int K) {
  9.            if(N<3)return 0;
  10.            sieve();//to get the primes
  11.            difBuild();//to build all the differences between index and the closest smaller prime
  12.            int l = firstlose(K);//get the first integer the difference between it and the closest smaller prime is bigger than K
  13.            if(l==-1||l>N){// you win
  14.                    return win(N,K);
  15.            }else{//you lose
  16.                    return lose(N,K);
  17.            }
  18.    }
  19.    private int lose(int n,int k) {
  20.            int turns=0;
  21.            while(true){
  22.                    if(dif[n]==0&&dif[n-1]>k-1)return -1*turns;//if you can't move
  23.                    if(dif[n]>k)return -1*turns;//if you can't move
  24.                    if(dif[n]==0)n--;//if you started at a prime
  25.                    n=n-dif[n];//get the closest prime
  26.                    for (int i = 1; i <= k; i++) {//search if there exist a losing state in range
  27.                            if(n-i<0)continue;
  28.                            if(dif[n-i]>k)return -1*(turns+2);
  29.                    }
  30.                    for (int i = 0; i < k; i++) {//get the smallest integer you can get
  31.                            if(n-k+i<0)continue;
  32.                            if(!primes[n-k+i]){n=n-k+i;break;}
  33.                    }
  34.                    turns+=2;
  35.            }
  36. }
  37. private int win(int n,int k) {
  38.         int turns=0;
  39.         while(true){
  40.                 if(n-3<=k){//no more moves
  41.                         return turns+1;
  42.                 }
  43.                 turns+=2;
  44.                 for (int i = 0; i < k; i++) {//get the smallest prime within range then remove one
  45.                         if(n-k+i<0)continue;
  46.                         if(primes[n-k+i]){n=n-k-1+i;break;}
  47.                 }
  48.         }
  49. }
  50. private void sieve() {
  51.         // TODO Auto-generated method stub
  52.         primes=new boolean[500000];
  53.         Arrays.fill(primes, true);
  54.         primes[0]=false;
  55.         primes[1]=false;
  56.         for (int i = 2; i < primes.length; i++) {
  57.                 if(primes[2]){
  58.                         for (int j = i+i; j < primes.length; j+=i) {
  59.                                 primes[j]=false;
  60.                         }
  61.                 }
  62.         }
  63.    }
  64.    
  65.         private void difBuild(){
  66.                 dif=new int[500000];
  67.                 for (int i = 2; i < dif.length; i++) {
  68.                         if(primes[i])dif[i]=0;
  69.                         else dif[i]=dif[i-1]+1;
  70.                 }
  71.         }
  72.         private int firstlose(int k){
  73.                 for (int i = 4; i < dif.length; i++) {
  74.                         if(dif[i]>k)return i;
  75.                 }
  76.                 return -1;
  77.         }
  78. }
Add Comment
Please, Sign In to add comment