Source code for submission s781

Go to diff to previous submission

fl.cpp

  1. #include <cstdio>
  2. #include <vector>
  3. #include <utility>
  4. #include <cstring>
  5.  
  6. int *gcdmem;
  7.  
  8. int gcd(int a, int b)
  9. {
  10. if (a < b)
  11. return gcd(b, a);
  12.  
  13. if (a % 2 == 0)
  14. {
  15. if (gcdmem[(a/2)*10020+b] == 0)
  16. {
  17. if (a == b)
  18. gcdmem[(a/2)*10020+b] = a;
  19. else if (a > b)
  20. gcdmem[(a/2)*10020+b] = gcd(a - b, b);
  21. else
  22. gcdmem[(a/2)*10020+b] = gcd(a, b - a);
  23. }
  24. return gcdmem[(a/2)*10020+b];
  25. }
  26. else
  27. {
  28. if (a == b)
  29. return a;
  30. else if (a > b)
  31. return gcd(a - b, b);
  32. else
  33. return gcd(a, b - a);
  34. }
  35. }
  36.  
  37. int findlcm(int a, int b)
  38. {
  39. return a * b / gcd(a, b);
  40.  
  41. //~ if (lcmmem[a*20020+b] == 0)
  42. //~ lcmmem[a*20020+b] = a * b / gcd(a, b);
  43.  
  44. //~ return lcmmem[a*20020+b];
  45. }
  46.  
  47. int main()
  48. {
  49. int k, bl;
  50.  
  51. try {
  52.  
  53. unsigned int results[10010];
  54. memset(results, 0, sizeof(results));
  55.  
  56. gcdmem = new int[10020 * 10020];
  57. memset(gcdmem, 0, sizeof(int) * 10020 * 10020);
  58.  
  59. while (scanf("%d/%d", &bl, &k) == 2)
  60. //~ for (int k = 10000; k > 1; k--)
  61. {
  62. if (results[k] == 0)
  63. {
  64. for (int i = k + 1; i <= 2 * k; i++)
  65. {
  66. int lcm = findlcm(i, k);
  67. int nom = (lcm / k) - (lcm / i);
  68. if (lcm % nom == 0)
  69. results[k]++;
  70. }
  71. }
  72.  
  73. printf("%u\n", results[k]);
  74. //~ printf("k=%d: %u\n", k, results[k]);
  75. }
  76. }
  77. catch (std::bad_alloc)
  78. {
  79. return 0;
  80. }
  81.  
  82. return 0;
  83. }
  84.  

Diff to submission s762

fl.cpp

--- c5.s762.cteam063.fl.cpp.0.fl.cpp
+++ c5.s781.cteam063.fl.cpp.0.fl.cpp
@@ -8,15 +8,29 @@
 int gcd(int a, int b)
 {
-        if (gcdmem[a*20020+b] == 0)
+        if (a < b)
+                return gcd(b, a);
+        
+        if (a % 2 == 0)
+        {
+                if (gcdmem[(a/2)*10020+b] == 0)
+                {
+                        if (a == b)
+                                gcdmem[(a/2)*10020+b] = a;
+                        else if (a > b)
+                                gcdmem[(a/2)*10020+b] = gcd(a - b, b);
+                        else
+                                gcdmem[(a/2)*10020+b] = gcd(a, b - a);
+                }
+                return gcdmem[(a/2)*10020+b];
+        }
+        else
         {
                 if (a == b)
-                        gcdmem[a*20020+b] = a;
+                        return a;
                 else if (a > b)
-                        gcdmem[a*20020+b] = gcd(a - b, b);
+                        return gcd(a - b, b);
                 else
-                        gcdmem[a*20020+b] = gcd(a, b - a);
+                        return gcd(a, b - a);
         }
-        
-        return gcdmem[a*20020+b];
 }
 
@@ -40,6 +54,6 @@
                 memset(results, 0, sizeof(results));
                 
-                gcdmem = new int[20020 * 20020];
-                memset(gcdmem, 0, sizeof(int) * 20020 * 20020);
+                gcdmem = new int[10020 * 10020];
+                memset(gcdmem, 0, sizeof(int) * 10020 * 10020);
                 
                 while (scanf("%d/%d", &bl, &k) == 2)