zoukankan      html  css  js  c++  java
  • FFT多项式乘法

    [LuoguP3803]

    学了好久才懂了那么一点点哎

    Code:

     1 #include <bits/stdc++.h>
     2 #define ll long long
     3 using namespace std;
     4 const int N = 1e7 + 7;
     5 const double Pi = acos(-1.0);
     6 ll read() {
     7     ll re = 0, f = 1;
     8     char ch = getchar();
     9     while (ch < '0' || ch > '9') {if (ch == '-') f = -f; ch = getchar();}
    10     while ('0' <= ch && ch <= '9') {re = re * 10 + ch - '0'; ch = getchar();}
    11     return re * f;
    12 }
    13 int n, m;
    14 int l, pos[N], limit = 1;
    15 struct Complex{
    16     double x, y;
    17     Complex (double nx = 0, double ny = 0) {x = nx, y = ny;}
    18 }a[N], b[N];
    19 Complex operator +(Complex a, Complex b) {return Complex(a.x + b.x, a.y + b.y);}
    20 Complex operator -(Complex a, Complex b) {return Complex(a.x - b.x, a.y - b.y);}
    21 Complex operator *(Complex a, Complex b) {return Complex(a.x*b.x-a.y*b.y, a.x*b.y+b.x*a.y);}
    22 void FFT(Complex *A, int f) {
    23     for (int i = 0; i < limit; i++) {
    24         if (i < pos[i]) swap(A[i], A[pos[i]]);
    25     }
    26     for (int mid = 1; mid < limit; mid <<= 1) {
    27         Complex wn(cos(Pi / mid), f * sin(Pi / mid));
    28         for (int r = mid << 1, i = 0; i < limit; i += r) {
    29             Complex w(1, 0);
    30             for (int k = 0; k < mid; k++, w = w * wn) {
    31                 Complex u = A[i + k], v = w * A[i + k + mid];
    32                 A[i + k] = u + v;
    33                 A[i + k + mid] = u - v;
    34             }
    35         }
    36     }
    37     if (f == -1) {
    38         for (int i = 0; i < limit; i++) A[i].x /= limit;
    39     }
    40 }
    41 int main () {
    42     n = read(), m = read();
    43     for (int i = 0; i <= n; i++) {
    44         a[i].x = read();
    45     }
    46     for (int i = 0; i <= m; i++) {
    47         b[i].x = read();
    48     }
    49     while (limit <= n + m) l++, limit <<= 1;
    50     for (int i = 0; i < limit; i++) {
    51         pos[i] = (pos[i >> 1] >> 1) | ((i & 1) << (l - 1));
    52     }
    53     FFT(a, 1), FFT(b, 1);
    54     for (int i = 0; i < limit; i++) {
    55         a[i] = a[i] * b[i];
    56     }
    57     FFT(a, -1);
    58     for (int i = 0; i <= n + m; i++) {
    59         printf("%d%c", (int)(a[i].x + 0.5), i == n + m ? '
    ' : ' ');
    60     }
    61     return 0;
    62 }
    View Code
  • 相关阅读:
    洛谷 P2058 海港(模拟)
    LA 3708 墓地雕塑(模拟)
    Uva 11300 Spreading the Wealth(贪心)
    UVA 11729 Commando War (贪心)
    【洛谷习题】Likecloud-吃、吃、吃
    【洛谷习题】多米诺骨牌
    【洛谷习题】相似基因
    【NOI1995】石子合并
    【洛谷习题】尼克的任务
    【NOIP2004】合唱队形
  • 原文地址:https://www.cnblogs.com/Sundial/p/12198653.html
Copyright © 2011-2022 走看看