【HACK】关于FFT不同写法会输出不同答案
查看原帖
【HACK】关于FFT不同写法会输出不同答案
141573
yaoxi楼主2022/1/8 12:40

众所周知IDFT有两种写法,一种是最后翻转序列,另一种是单位复根取cos(2πn)isin(2πn)\cos\left(\frac{2\pi}{n}\right)-i\sin\left(\frac{2\pi}{n}\right),代码如下:

void fft(comp* f, int len, int on) {
    change(f, len);
    for (int h = 2; h <= len; h <<= 1) {
        // #1
        // comp wn(cos(2 * PI / h), sin(2 * PI / h));
        // #2
        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) {
        // #1
        // reverse(f + 1, f + len);
        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

这会不会是精度的问题?还是有其他的什么原因?

2022/1/8 12:40
加载中...