You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
2.0 KiB
C++
65 lines
2.0 KiB
C++
#include <cmath>
|
|
#include <cstdio>
|
|
#include <cstring>
|
|
const int N = 1000;
|
|
const double pi = acos(-1);
|
|
struct complex
|
|
{
|
|
double r, i;
|
|
} a[N], b[N], tmp[N];
|
|
#define op(T, O) inline T operator O(const T &x, const T &y)
|
|
char s1[N], s2[N];
|
|
int ans[N];
|
|
op(complex, +) { return { x.r + y.r, x.i + y.i }; }
|
|
op(complex, -) { return { x.r - y.r, x.i - y.i }; }
|
|
op(complex, *) { return { x.r * y.r - x.i * y.i, x.r * y.i + x.i * y.r }; }
|
|
void naive_DFT(complex *arr, const int len)
|
|
{
|
|
memset(tmp, 0, sizeof(tmp));
|
|
for (int k = 0; k < len; k++)
|
|
for (int n = 0; n < len; n++)
|
|
tmp[k] = tmp[k] + arr[n] * complex{ cos(-2 * pi / len * k * n), sin(-2 * pi / len * k * n) };
|
|
memcpy(arr, tmp, sizeof(tmp));
|
|
}
|
|
void naive_IDFT(complex *arr, const int len)
|
|
{
|
|
memset(tmp, 0, sizeof(tmp));
|
|
for (int k = 0; k < len; k++)
|
|
for (int n = 0; n < len; n++)
|
|
tmp[k] = tmp[k] + arr[n] * complex{ cos(2 * pi / len * k * n), sin(2 * pi / len * k * n) };
|
|
memcpy(arr, tmp, sizeof(tmp));
|
|
for (int i = 0; i < len; i++)
|
|
arr[i].r /= len;
|
|
}
|
|
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), len2 = (int)strlen(s2), len = len1 + len2;
|
|
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';
|
|
naive_DFT(a, len), naive_DFT(b, len);
|
|
for (int i = 0; i < len; i++)
|
|
a[i] = a[i] * b[i];
|
|
naive_IDFT(a, len);
|
|
for (int i = 0; i < len; i++)
|
|
ans[i] = int(a[i].r + 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;
|
|
}
|