diff --git a/Algorithms/FFT.cpp b/Algorithms/FFT.cpp new file mode 100644 index 0000000..1f5fe39 --- /dev/null +++ b/Algorithms/FFT.cpp @@ -0,0 +1,91 @@ +#include +#include +#include +const int N = 500005; +const double pi = acos(-1); +struct complex +{ + double r, i; +} a[N], b[N]; +inline complex operator+(const complex &x, const complex &y) +{ + return { x.r + y.r, x.i + y.i }; +} +inline complex operator-(const complex &x, const complex &y) +{ + return { x.r - y.r, x.i - y.i }; +} +inline complex operator*(const complex &x, const complex &y) +{ + return { x.r * y.r - x.i * y.i, x.r * y.i + x.i * y.r }; +} +char s1[N], s2[N]; +int ans[N]; +void Rader(complex *F, int len) +{ + complex t; + int j = len >> 1; + for (int i = 1; i < len - 1; i++) + { + if (i < j) + t = F[i], F[i] = F[j], F[j] = t; + int k = len >> 1; + while (j >= k) + j -= k, k >>= 1; + if (j < k) + j += k; + } +} +void fft(complex *F, int len, int flag) +{ + Rader(F, len); + for (int h = 2; h <= len; h <<= 1) + { + const complex wn = { cos(-flag * 2 * pi / h), sin(-flag * 2 * pi / h) }; + for (int j = 0; j < len; j += h) + { + complex w = { 1, 0 }; + int m = h >> 1; + for (int k = j; k < j + m; k++, w = w * wn) + { + complex u = F[k], t = w * F[k + m]; + F[k] = u + t, F[k + m] = u - t; + } + } + } +} +int main() +{ + while (~scanf("%s%s", s1, s2)) + { + int len1, len2, len; + memset(a, 0, sizeof(a)); + memset(b, 0, sizeof(b)); + memset(ans, 0, sizeof(ans)); + len1 = (int)strlen(s1) << 1, len2 = (int)strlen(s2) << 1; + for (len = 1; len < len1 || len < len2;) + len <<= 1; + len1 >>= 1, len2 >>= 1; + for (int i = 0; i < len1; i++) + a[i].r = s1[len1 - 1 - i] - '0'; + for (int i = 0; i < len2; i++) + b[i].r = s2[len2 - 1 - i] - '0'; + fft(a, len, 1); + fft(b, len, 1); + for (int i = 0; i < len; i++) + a[i] = a[i] * b[i]; + fft(a, len, -1); + for (int i = 0; i < len; i++) + ans[i] = int(a[i].r / len + 0.5); + for (int i = 0; i < len; i++) + ans[i + 1] += ans[i] / 10, ans[i] %= 10; + int high = 0; + for (int i = len - 1; high == 0 && i >= 0; i--) + if (ans[i]) + high = i; + for (int i = high; i >= 0; i--) + putchar(ans[i] + '0'); + putchar('\n'); + } + return 0; +} \ No newline at end of file diff --git a/OnlineJudges/hdu/1402.cpp b/OnlineJudges/hdu/1402.cpp new file mode 100644 index 0000000..1f5fe39 --- /dev/null +++ b/OnlineJudges/hdu/1402.cpp @@ -0,0 +1,91 @@ +#include +#include +#include +const int N = 500005; +const double pi = acos(-1); +struct complex +{ + double r, i; +} a[N], b[N]; +inline complex operator+(const complex &x, const complex &y) +{ + return { x.r + y.r, x.i + y.i }; +} +inline complex operator-(const complex &x, const complex &y) +{ + return { x.r - y.r, x.i - y.i }; +} +inline complex operator*(const complex &x, const complex &y) +{ + return { x.r * y.r - x.i * y.i, x.r * y.i + x.i * y.r }; +} +char s1[N], s2[N]; +int ans[N]; +void Rader(complex *F, int len) +{ + complex t; + int j = len >> 1; + for (int i = 1; i < len - 1; i++) + { + if (i < j) + t = F[i], F[i] = F[j], F[j] = t; + int k = len >> 1; + while (j >= k) + j -= k, k >>= 1; + if (j < k) + j += k; + } +} +void fft(complex *F, int len, int flag) +{ + Rader(F, len); + for (int h = 2; h <= len; h <<= 1) + { + const complex wn = { cos(-flag * 2 * pi / h), sin(-flag * 2 * pi / h) }; + for (int j = 0; j < len; j += h) + { + complex w = { 1, 0 }; + int m = h >> 1; + for (int k = j; k < j + m; k++, w = w * wn) + { + complex u = F[k], t = w * F[k + m]; + F[k] = u + t, F[k + m] = u - t; + } + } + } +} +int main() +{ + while (~scanf("%s%s", s1, s2)) + { + int len1, len2, len; + memset(a, 0, sizeof(a)); + memset(b, 0, sizeof(b)); + memset(ans, 0, sizeof(ans)); + len1 = (int)strlen(s1) << 1, len2 = (int)strlen(s2) << 1; + for (len = 1; len < len1 || len < len2;) + len <<= 1; + len1 >>= 1, len2 >>= 1; + for (int i = 0; i < len1; i++) + a[i].r = s1[len1 - 1 - i] - '0'; + for (int i = 0; i < len2; i++) + b[i].r = s2[len2 - 1 - i] - '0'; + fft(a, len, 1); + fft(b, len, 1); + for (int i = 0; i < len; i++) + a[i] = a[i] * b[i]; + fft(a, len, -1); + for (int i = 0; i < len; i++) + ans[i] = int(a[i].r / len + 0.5); + for (int i = 0; i < len; i++) + ans[i + 1] += ans[i] / 10, ans[i] %= 10; + int high = 0; + for (int i = len - 1; high == 0 && i >= 0; i--) + if (ans[i]) + high = i; + for (int i = high; i >= 0; i--) + putchar(ans[i] + '0'); + putchar('\n'); + } + return 0; +} \ No newline at end of file diff --git a/OnlineJudges/lydsy/cur.cpp b/OnlineJudges/hdu/hdu.cpp similarity index 100% rename from OnlineJudges/lydsy/cur.cpp rename to OnlineJudges/hdu/hdu.cpp diff --git a/OnlineJudges/poj/cur.cpp b/OnlineJudges/poj/cur.cpp deleted file mode 100644 index e69de29..0000000