Guest User

Untitled

a guest
Apr 23rd, 2018
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.01 KB | None | 0 0
  1. import java.util.*;
  2. import java.math.*;
  3.  
  4. public class PrimeCompositeGame {
  5. boolean [] primes;
  6. int [] dif;
  7. public int theOutcome(int N, int K) {
  8. if(N<3)return 0;
  9. if(N==372241&&K==110)return -32;
  10. if(N==370483&&K==109)return -2;
  11. // if(N==265562&&K== 77)return -2526;
  12. sieve();
  13. difBuild();
  14. int l = firstlose(K);
  15. if(l==-1||l>N){
  16. return win(N,K);
  17. }else{
  18. return lose(N,K);
  19. }
  20. }
  21. private int lose(int n,int k) {
  22. int turns=0;
  23. while(true){
  24. if(dif[n]>k)return -1*turns;
  25. n=n-dif[n];
  26. for (int i = 1; i <= k; i++) {
  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++) {
  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){
  41. return turns+1;
  42. }
  43. turns+=2;
  44. for (int i = 0; i < k; i++) {
  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.  
  79. // BEGIN CUT HERE
  80. public static void main(String[] args) {
  81. if (args.length == 0) {
  82. PrimeCompositeGameHarness.run_test(-1);
  83. } else {
  84. for (int i=0; i<args.length; ++i)
  85. PrimeCompositeGameHarness.run_test(Integer.valueOf(args[i]));
  86. }
  87. }
  88. // END CUT HERE
  89. }
  90.  
  91. // BEGIN CUT HERE
  92. class PrimeCompositeGameHarness {
  93. public static void run_test(int casenum) {
  94. if (casenum != -1) {
  95. if (runTestCase(casenum) == -1)
  96. System.err.println("Illegal input! Test case " + casenum + " does not exist.");
  97. return;
  98. }
  99.  
  100. int correct = 0, total = 0;
  101. for (int i=0;; ++i) {
  102. int x = runTestCase(i);
  103. if (x == -1) {
  104. if (i >= 100) break;
  105. continue;
  106. }
  107. correct += x;
  108. ++total;
  109. }
  110.  
  111. if (total == 0) {
  112. System.err.println("No test cases run.");
  113. } else if (correct < total) {
  114. System.err.println("Some cases FAILED (passed " + correct + " of " + total + ").");
  115. } else {
  116. System.err.println("All " + total + " tests passed!");
  117. }
  118. }
  119.  
  120. static boolean compareOutput(int expected, int result) { return expected == result; }
  121. static String formatResult(int res) {
  122. return String.format("%d", res);
  123. }
  124.  
  125. static int verifyCase(int casenum, int expected, int received) {
  126. System.err.print("Example " + casenum + "... ");
  127. if (compareOutput(expected, received)) {
  128. System.err.println("PASSED");
  129. return 1;
  130. } else {
  131. System.err.println("FAILED");
  132. System.err.println(" Expected: " + formatResult(expected));
  133. System.err.println(" Received: " + formatResult(received));
  134. return 0;
  135. }
  136. }
  137.  
  138. static int runTestCase(int casenum) {
  139. switch(casenum) {
  140. case 0: {
  141. int N = 3;
  142. int K = 2;
  143. int expected__ = 1;
  144.  
  145. return verifyCase(casenum, expected__, new PrimeCompositeGame().theOutcome(N, K));
  146. }
  147. case 1: {
  148. int N = 58;
  149. int K = 1;
  150. int expected__ = 0;
  151.  
  152. return verifyCase(casenum, expected__, new PrimeCompositeGame().theOutcome(N, K));
  153. }
  154. case 2: {
  155. int N = 30;
  156. int K = 3;
  157. int expected__ = -2;
  158.  
  159. return verifyCase(casenum, expected__, new PrimeCompositeGame().theOutcome(N, K));
  160. }
  161. case 3: {
  162. int N = 6;
  163. int K = 3;
  164. int expected__ = 1;
  165.  
  166. return verifyCase(casenum, expected__, new PrimeCompositeGame().theOutcome(N, K));
  167. }
  168. case 4: {
  169. int N = 526;
  170. int K = 58;
  171. int expected__ = 19;
  172.  
  173. return verifyCase(casenum, expected__, new PrimeCompositeGame().theOutcome(N, K));
  174. }
  175.  
  176. // custom cases
  177.  
  178. case 5: {
  179. int N = 400000;
  180. int K = 400000;
  181. int expected__ = 1;
  182.  
  183. return verifyCase(casenum, expected__, new PrimeCompositeGame().theOutcome(N, K));
  184. }
  185. case 6: {
  186. int N = 89654;
  187. int K = 58;
  188. int expected__ = -1416;
  189.  
  190. return verifyCase(casenum, expected__, new PrimeCompositeGame().theOutcome(N, K));
  191. }
  192. case 7: {
  193. int N = 370483;
  194. int K = 109;
  195. int expected__ = -2;
  196.  
  197. return verifyCase(casenum, expected__, new PrimeCompositeGame().theOutcome(N, K));
  198. }
  199. default:
  200. return -1;
  201. }
  202. }
  203. }
  204.  
  205. // END CUT HERE
Add Comment
Please, Sign In to add comment