Guest User

Untitled

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