luogu P1919 【模板】A*B Problem升级版(FFT快速傅里叶)

模板

做多项式乘法,进位
没了

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define pi acos(-1.0)
inline int read() {
    int x = 0,f = 1;
    char c = getchar();
    while(c < '0' || c > '9')c = getchar();
    while(c <= '9' && c >= '0')x = x * 10 + c - '0',c = getchar();
    return x * f;
}
const int maxn = 400007;
struct cp {
    double x,y;
    cp (double a = 0,double b = 0): x(a),y(b) {};
} A[maxn],B[maxn];
cp operator + (cp a,cp b) { return cp(a.x + b.x,a.y + b.y);}
cp operator - (cp a,cp b) { return cp(a.x - b.x,a.y - b.y);}
cp operator * (cp a,cp b) { return cp(a.x * b.x - a.y * b.y,a.x * b.y + a.y * b.x); }
void fft(cp *a,int n, int type) {
    for(int i = 0,j = 0;i < n;++ i)  {
        if(i < j) std::swap(a[i],a[j]);
            for(int k = n >> 1;(j ^= k) < k;k >>= 1);
    }
    for(int m = 2;m <= n;m <<= 1) {
        cp w1 = cp(cos(2 * pi / m),type * sin(2 * pi / m));
        for(int i = 0;i < n;i += m) {
            cp w = cp(1.0,0);
            for(int k = 0;k < (m >> 1);++ k) {
                cp t = w * a[i + k + (m >> 1)],u = a[i + k];
                a[i + k] = u + t;
                a[i + k + (m >> 1)] = u - t;
                w = w * w1;
            }
        }
    }
}
int c[maxn];
char s1[maxn],s2[maxn];
int main() {
    int n = read(); --n;
    scanf("%s%s",s1,s2);
    for(int i  = 0;i <= n;++ i) A[i].x = s1[n - i] - '0',B[i].x = s2[n -i] - '0';
    int tmp = n;
    //printf("%d\n",n);
    for(n = 1;n <= tmp * 2;n <<= 1);
    //printf("%d\n",n);
    fft(A,n,1);
    fft(B,n,1);
    /*for(int i = 0;i <= n;++ i)  {
        printf("%lf\n",A[i].x);
    } */
    for(int i = 0;i <= n;++ i) A[i] = A[i] * B[i];
    fft(A,n,-1);
    for(int i = 0;i <= n;++ i) c[i] = int(A[i].x / n + 0.5);
    for(int i = 0;i <= n;++ i)
        if(c[i] > 10) {
            //printf("%d\n",c[i]);
            c[i + 1] += c[i] / 10,c[i] %= 10;
            if(i + 1 > n) n ++;
        }
    for(int i = n;i >= 0;i --)
        if(!c[i]) n--;else break;
    for(int i = n;i >= 0;i --) printf("%d",c[i]);
    puts("");
    return 0;
}
 

原文地址:https://www.cnblogs.com/sssy/p/9192085.html

时间: 2024-10-11 17:30:09

luogu P1919 【模板】A*B Problem升级版(FFT快速傅里叶)的相关文章

洛谷.1919.[模板]A乘B Problem升级版(FFT)

题目链接:洛谷.BZOJ2179 //将乘数拆成 a0*10^n + a1*10^(n-1) + ... + a_n-1的形式 //可以发现多项式乘法就模拟了竖式乘法 所以用FFT即可 注意处理进位 //n位*n位最多就只有2n位了 //论putchar的速度..还是快的 #include <cmath> #include <cstdio> #include <cctype> #include <algorithm> #define gc() getchar

P1919 【模板】A*B Problem升级版(FFT快速傅里叶)

P1919 [模板]A*B Problem升级版(FFT快速傅里叶) 思路还是挺简单的. 输入的2个数 \(a=\overline{a_n a_{n-1} a_{n-2}\cdots a_{0}}\) , \(b=\overline{b_m b_{m-1} b_{m-2}\cdots b_{0}}\) 直接把 \(a_i\) 和 \(b_i\) 看做多项式 A 和 B 的系数,做多项式乘法即可.因为 a ,b 可以看做以 \(a_i,b_i\) 为系数,自变量为10的多项式的值,乘完后的多项式的

FFT快速傅里叶模板

FFT快速傅里叶模板-- /* use way: assign : h(x) = f(x) * g(x) f(x):len1 g(x):len2 1. len = 1; while(len < 2 * len1 || len < 2 * len2) len <<= 1; 2. for i=0 to len1-1 : x1[i](f(i),0) for i=len1 to len-1 : x1[i](0.0) g(x) is same..... 3. fft(x1,len,1) ff

[luogu P3384] [模板]树链剖分

[luogu P3384] [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式: 2 x y 表示求树从x到y结点最短路径上所有节点的值之和 操作3: 格式: 3 x z 表示将以x为根节点的子树内所有节点值都加上z 操作4: 格式: 4 x 表示求以x为根节点的子树内所有节点值之和 输入输出格式 输入格式: 第一行包含4个正整数

洛谷P3803 【模板】多项式乘法(FFT)

P3803 [模板]多项式乘法(FFT) 题目背景 这是一道FFT模板题 题目描述 给定一个n次多项式F(x),和一个m次多项式G(x). 请求出F(x)和G(x)的卷积. 输入输出格式 输入格式: 第一行2个正整数n,m. 接下来一行n+1个数字,从低到高表示F(x)的系数. 接下来一行m+1个数字,从低到高表示G(x))的系数. 输出格式: 一行n+m+1个数字,从低到高表示F(x)∗G(x)的系数. 输入输出样例 输入样例#1: 复制 1 2 1 2 1 2 1 输出样例#1: 复制 1

luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树)(主席树)

luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<cmath> #include<cstring> #include<iomanip> #include<algorithm> #include<ctime> #include<queue> #inc

luogu P1919 【模板】A*B Problem升级版(FFT快速傅里叶)|FFT

题目描述 给你两个正整数 a,b,求 a×b. 输入格式 第一行一个正整数,表示 a: 第二行一个正整数,表示 b. 输出格式 输出一行一个整数表示答案. #include<cmath> #include<string> #include<cstdio> #include<iostream> #include<algorithm> using namespace std; const int _=4e6+10; const double Pi=a

[Luogu 1919]【模板】A*B Problem升级版(FFT快速傅里叶)

Description 给出两个n位10进制整数x和y,你需要计算x*y. Input 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数为n的正整数y. Output 输出一行,即x*y的结果.(注意判断前导0) Sample Input 134 Sample Output 12 HINT n<=60000 题解 A*B Problem.和 A+B Problem 一样简单. 1 input() and print(int(input()) * int(input()

luogu P3803 【模板】多项式乘法(FFT)

题目背景 这是一道 FFT 模板题 题目描述 给定一个 n 次多项式 F(x),和一个 m 次多项式 G(x). 请求出 F(x) 和 G(x) 的卷积. 输入格式 第一行 2 个正整数 n,m. 接下来一行 n+1 个数字,从低到高表示 F(x) 的系数. 接下来一行 m+1 个数字,从低到高表示 G(x) 的系数. 输出格式 一行 n+m+1 个数字,从低到高表示 F(x)*G(x) 的系数. #include<cmath> #include<cstdio> #include&