众所周知IDFT有两种写法,一种是最后翻转序列,另一种是单位复根取cos(n2π)−isin(n2π),代码如下:
void fft(comp* f, int len, int on) {
change(f, len);
for (int h = 2; h <= len; h <<= 1) {
comp wn(cos(2 * PI / h), sin(2 * PI / h * on));
for (int j = 0; j < len; j += h) {
comp w(1, 0);
for (int k = j; k < j + h / 2; ++k) {
comp u = f[k], t = w * f[k + h / 2];
f[k] = u + t, f[k + h / 2] = u - t;
w *= wn;
}
}
}
if (on == -1) {
for (int i = 0; i < len; ++i)
f[i] /= len;
}
}
这两种方法理论上会输出相同的答案,在这道题中也都能AC。但是以下数据却有不同的输出:
Input
12345 54321 99999
Output 方法1(我一般的写法)
73118
Output 方法2(@dead_X 的写法)
62069
Output MTT(@Vocalise @LiberShip 的写法)
48757
这会不会是精度的问题?还是有其他的什么原因?