Go to diff to previous submission
#include <cstdio> #include <vector> #include <utility> #include <cstring> int *gcdmem; int gcd(int a, int b) { if (gcdmem[a*20020+b] == 0) { if (a == b) gcdmem[a*20020+b] = a; else if (a > b) gcdmem[a*20020+b] = gcd(a - b, b); else gcdmem[a*20020+b] = gcd(a, b - a); } return gcdmem[a*20020+b]; } int findlcm(int a, int b) { return a * b / gcd(a, b); //~ if (lcmmem[a*20020+b] == 0) //~ lcmmem[a*20020+b] = a * b / gcd(a, b); //~ return lcmmem[a*20020+b]; } int main() { int k, bl; unsigned int results[10010]; memset(results, 0, sizeof(results)); gcdmem = new int[20020 * 20020]; memset(gcdmem, 0, sizeof(int) * 20020 * 20020); while (scanf("%d/%d", &bl, &k) == 2) //~ for (int k = 200; k < 500; k++) { if (results[k] == 0) { std::vector< std::pair<int, int> > egypt; for (int i = k + 1; i <= 2 * k; i++) { int lcm = findlcm(i, k); int nom = (lcm / k) - (lcm / i); if (lcm % nom == 0) egypt.push_back(std::make_pair(lcm / nom, 1)); } results[k] = egypt.size(); } printf("%u\n", results[k]); //~ printf("k=%d: %u\n", k, results[k]); } return 0; }
--- c5.s502.cteam063.fl.cpp.0.fl.cpp +++ c5.s750.cteam063.fl.cpp.0.fl.cpp @@ -4,28 +4,29 @@ #include <cstring> -int **gcdmem; -int **lcmmem; +int *gcdmem; int gcd(int a, int b) { - if (gcdmem[a][b] == 0) + if (gcdmem[a*20020+b] == 0) { if (a == b) - gcdmem[a][b] = a; + gcdmem[a*20020+b] = a; else if (a > b) - gcdmem[a][b] = gcd(a -b, b); + gcdmem[a*20020+b] = gcd(a - b, b); else - gcdmem[a][b] = gcd(a, b - a); + gcdmem[a*20020+b] = gcd(a, b - a); } - return gcdmem[a][b]; + return gcdmem[a*20020+b]; } int findlcm(int a, int b) { - if (lcmmem[a][b] == 0) - lcmmem[a][b] = a * b / gcd(a, b); + return a * b / gcd(a, b); - return lcmmem[a][b]; + //~ if (lcmmem[a*20020+b] == 0) + //~ lcmmem[a*20020+b] = a * b / gcd(a, b); + + //~ return lcmmem[a*20020+b]; } @@ -37,19 +38,9 @@ memset(results, 0, sizeof(results)); - gcdmem = new int*[10010]; - for (unsigned int i = 0; i < 10010; i++) - { - gcdmem[i] = new int[10010]; - memset(gcdmem[i], 0, sizeof(int)*10010); - } - - lcmmem = new int*[10010]; - for (unsigned int i = 0; i < 10010; i++) - { - lcmmem[i] = new int[10010]; - memset(lcmmem[i], 0, sizeof(int)*10010); - } + gcdmem = new int[20020 * 20020]; + memset(gcdmem, 0, sizeof(int) * 20020 * 20020); while (scanf("%d/%d", &bl, &k) == 2) + //~ for (int k = 200; k < 500; k++) { if (results[k] == 0) @@ -67,4 +58,5 @@ printf("%u\n", results[k]); + //~ printf("k=%d: %u\n", k, results[k]); }