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=acos(-1.0);
#define db double
struct lex{
    db x,y;
    lex(db _x=0,db _y=0){x=_x;y=_y;}
    lex operator + (const lex &b)const{return lex(x+b.x,y+b.y);}
    lex operator - (const lex &b)const{return lex(x-b.x,y-b.y);}
    lex operator * (const lex &b)const{return lex(x*b.x-y*b.y,x*b.y+y*b.x);}
}a[_],b[_];
int N,M;
inline void fft(int lim,lex *a,int op){
    if(lim==1)return;
    lex a1[(lim>>1)+5],a2[(lim>>1)+5];
    for(int i=0;i<lim;i+=2)a1[i>>1]=a[i],a2[i>>1]=a[i+1];
    fft(lim>>1,a1,op);
    fft(lim>>1,a2,op);
    lex Wn=lex(cos(2.0*Pi/lim),op*sin(2.0*Pi/lim));
    lex w=lex(1,0);
    for(int i=0;i<(lim>>1);i++,w=w*Wn){
        a[i]=a1[i]+w*a2[i];
        a[i+(lim>>1)]=a1[i]-w*a2[i];
    }
}
int ans[_],AA,BB;
signed main(){
    string s1,s2; cin>>s1>>s2;
    N=s1.length(); M=s2.length();
    register int i;
    for(i=N-1;i>=0;i--)a[AA++].x=s1[i]-'0';
    for(i=M-1;i>=0;i--)b[BB++].x=s2[i]-'0';
    register int lim=1; while(lim<=N+M)lim<<=1;
    fft(lim,a,1);
    fft(lim,b,1);
    for(i=0;i<=lim;i++)a[i]=a[i]*b[i];
    fft(lim,a,-1);
    for(i = 0; i <= lim; i++) {
        ans[i]+=(int)(a[i].x/lim+0.5);
        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 ;
}

原文地址:https://www.cnblogs.com/naruto-mzx/p/12106243.html

时间: 2024-07-31 20:40:50

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

【BZOJ-2179】FFT快速傅里叶 FFT

2179: FFT快速傅立叶 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2978  Solved: 1523[Submit][Status][Discuss] Description 给出两个n位10进制整数x和y,你需要计算x*y. Input 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数为n的正整数y. Output 输出一行,即x*y的结果. Sample Input 1 3 4 Sample Outpu

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个正整数

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

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

傅里叶变换,fft,fft energy

傅里叶变换:将信号转化到频率空间,详解:http://blog.jobbole.com/70549/ 图像傅里叶变换:傅立叶变换的物理意义是将图像的灰度分布函数变换为图像的频率分布函数, 空间三维,图像二维,因此空间中物体在另一个维度上的关系,就必须由梯度来表示,这样我们才能通过观察图像得知物体在三维空间中的对应关系. 图像傅里叶详解:http://www.cnblogs.com/EverYoung/archive/2012/05/29/2524058.html fft:快速傅里叶变换,nump

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'

[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()

洛谷.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