关于FFT

学术版

@[Isaunoya](/user/96580) round貌似也行的 内置函数?(大雾 AC了,感谢大佬
by 朕在世界之巅 @ 2020-08-05 11:23:44


改了一下貌似能过样例了? 似乎是gets的锅 ```cpp #include <bits/stdc++.h> #define MAXN 3000100 using namespace std; char s1[MAXN], s2[MAXN]; int n = 0, m = 0, ans[MAXN], a = 0, b = 0, lim = 1, l, r[MAXN]; const double pi = acos(-1.0), eps = 0.5; struct Complex { double a, b; inline Complex(double x = 0, double y = 0) : a(x), b(y) {} } A[MAXN], B[MAXN]; inline Complex operator + (Complex x, Complex y) { return Complex(x.a + y.a, x.b + y.b); } inline Complex operator - (Complex x, Complex y) { return Complex(x.a - y.a, x.b - y.b); } inline Complex operator * (Complex x, Complex y) { return Complex(x.a * y.a - x.b * y.b, x.a * y.b + x.b * y.a); } inline void FFT(Complex *c, double opt) { for(int i = 0; i < lim; i++) if(i < r[i]) swap(c[i], c[r[i]]); for(int j = 1; j < lim; j <<= 1) { Complex T(cos(pi / (j)), opt * sin(pi / (j))); for(int k = 0; k < lim; k += (j << 1)) { Complex t(1, 0); for(l = 0; l < j; l++, t = t * T) { Complex newx = c[k + l], newy = t * c[k + j + l]; c[k + l] = newx + newy; c[k + j + l] = newx - newy; } } } } int main(void) { gets(s1), gets(s2); n = strlen(s1), m = strlen(s2); n--,m--; for(int i = n-1 ; i >= 0; i--) A[a++].a = s1[i] - 48; for(int i = m-1 ; i >= 0; i--) B[b++].a = s2[i] - 48; while(lim < n + m) lim <<= 1, l++; for(int i = 0; i <= lim; i++) r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l - 1)); FFT(A, 1), FFT(B, 1); for(int i = 0; i <= lim; i++) A[i] = A[i] * B[i]; FFT(A, -1); for(int i = 0; i <= lim; i++) { ans[i] += (int) (A[i].a / lim + eps); if(ans[i] >= 10) ans[i + 1] += ans[i] / 10, ans[i] %= 10, lim += (i == lim); } while(!ans[lim] && lim >= 1) lim--; lim++; while(--lim >= 0) printf("%d",ans[lim]); return 0; } ```
by 寒冰大大 @ 2020-08-05 11:29:08


@[Isaunoya](/user/96580) 等等 aaa我试错地方了…… 还是错的,而且更离谱了 样例输出变成了 `2198429-833-110-123-150`
by 朕在世界之巅 @ 2020-08-05 11:29:21


@[寒冰大大](/user/38636) 哦?我试试
by 朕在世界之巅 @ 2020-08-05 11:36:33


@[朕在世界之巅](/user/356740) ~~手滑了多打了个m--看着输出正数就没管了~~ 实际上这个代码这样就可以过了 ```cpp #include <bits/stdc++.h> #define MAXN 3000100 using namespace std; char s1[MAXN], s2[MAXN]; int n = 0, m = 0, ans[MAXN], a = 0, b = 0, lim = 1, l, r[MAXN]; const double pi = acos(-1.0), eps = 0.5; struct Complex { double a, b; inline Complex(double x = 0, double y = 0) : a(x), b(y) {} } A[MAXN], B[MAXN]; inline Complex operator + (Complex x, Complex y) { return Complex(x.a + y.a, x.b + y.b); } inline Complex operator - (Complex x, Complex y) { return Complex(x.a - y.a, x.b - y.b); } inline Complex operator * (Complex x, Complex y) { return Complex(x.a * y.a - x.b * y.b, x.a * y.b + x.b * y.a); } inline void FFT(Complex *c, double opt) { for(int i = 0; i < lim; i++) if(i < r[i]) swap(c[i], c[r[i]]); for(int j = 1; j < lim; j <<= 1) { Complex T(cos(pi / (j)), opt * sin(pi / (j))); for(int k = 0; k < lim; k += (j << 1)) { Complex t(1, 0); for(l = 0; l < j; l++, t = t * T) { Complex newx = c[k + l], newy = t * c[k + j + l]; c[k + l] = newx + newy; c[k + j + l] = newx - newy; } } } } int main(void) { gets(s1), gets(s2); n = strlen(s1), m = strlen(s2); n--; for(int i = n-1 ; i >= 0; i--) A[a++].a = s1[i] - 48; for(int i = m-1 ; i >= 0; i--) B[b++].a = s2[i] - 48; while(lim <= n + m) lim <<= 1, l++; for(int i = 0; i <= lim; i++) r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l - 1)); FFT(A, 1), FFT(B, 1); for(int i = 0; i <= lim; i++) A[i] = A[i] * B[i]; FFT(A, -1); for(int i = 0; i <= lim; i++) { ans[i] += (int) (A[i].a / lim + eps); if(ans[i] >= 10) ans[i + 1] += ans[i] / 10, ans[i] %= 10, lim += (i == lim); } while(!ans[lim] && lim >= 1) lim--; lim++; while(--lim >= 0) printf("%d",ans[lim]); return 0; } ```
by 寒冰大大 @ 2020-08-05 11:37:27


@[寒冰大大](/user/38636) 不对啊 少了个0
by 朕在世界之巅 @ 2020-08-05 11:38:51


@[寒冰大大](/user/38636) 的确是gets的锅 我是说背的那么好咋会错呢……
by 朕在世界之巅 @ 2020-08-05 11:42:16


上一页 |