首页 > 其他分享 >多项式全家桶

多项式全家桶

时间:2023-03-11 21:13:06浏览次数:72  
标签:CH const int 多项式 全家 Complex return FL

有时间再修

\(\operatorname{FFT}\)

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

点击查看代码
#include<bits/stdc++.h>
#define cs const
#define il inline
#define fo(i,j,k) for(int i=(j);(i)<=(k);++(i))
#define of(i,j,k),for(int i=(j);(i)>=(k);--(i))
#define LL long long
using namespace std;
cs int N=3e6+9;
cs double pi=acos(-1);
int FL,CH;
template<typename T>bool in(T&a)
{
    for(FL=1;!isdigit(CH)&&CH!=EOF;CH=getchar())
        if(CH=='-')FL=-1;
    for(a=0;isdigit(CH);CH=getchar())
        a=a*10+CH-'0';
    return a*=FL,CH==EOF?0:1;
}
template<typename T,typename...Args>
int in(T&a,Args&...args){return in(a)+in(args...);}
struct Complex
{
    double x,y;
    Complex operator+(const Complex &a) const
    { return {x+a.x,y+a.y}; }
    Complex operator-(const Complex &a) const
    { return {x-a.x,y-a.y}; }
    Complex operator*(const Complex &a) const
    { return {x*a.x-y*a.y,x*a.y+y*a.x}; }
}A[N],B[N];
int rev[N],bit,tot,n,m;
il void FFT(Complex a[],int inv)
{
    fo(i,0,tot-1) if(i<rev[i]) swap(a[i],a[rev[i]]);
    for(int mid=1;mid<tot;mid<<=1)
    {
        Complex w1=(Complex){cos(pi/mid),inv*sin(pi/mid)};
        for(int i=0;i<tot;i+=mid*2)
        {
            Complex wk=(Complex){1,0};
            for(int j=0;j<mid;++j,wk=wk*w1)
            {
                Complex x=a[i+j],y=wk*a[i+j+mid];
                a[i+j]=x+y,a[i+j+mid]=x-y;
            }
        }
    }
}
signed main()
{
    in(n,m);
    fo(i,0,n) scanf("%lf",&A[i].x);
    fo(i,0,m) scanf("%lf",&B[i].x);
    while((1<<bit)<n+m+1) ++bit; //bit=ceil(log_2^n)
    tot=1<<bit;
    fo(i,0,tot-1) rev[i]=(rev[i>>1]>>1)|((i&1)<<(bit-1));
    FFT(A,1),FFT(B,1);
    fo(i,0,tot-1) A[i]=A[i]*B[i];
    FFT(A,-1);
    fo(i,0,n+m) printf("%d ",(int)(A[i].x/tot+0.5));
    return 0;
}

标签:CH,const,int,多项式,全家,Complex,return,FL
From: https://www.cnblogs.com/Bertidurlah/p/17206976.html

相关文章

  • Docker全家桶入门到进阶教程,Docker快速上手
    开发/运维互掐开发与测试和运维间的矛盾,主要是由于环境的不同而引发的。如果能将开发人员使用的环境交给测试与运维使用,这些问题就都能解决。DevOpsDevOps是一种思想......
  • Matlab 多项式的根求解
    ✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。......
  • 多项式小记
    多项式牛顿迭代对于\(G(f(x))=0\),求解\(f\pmod{x^n}\)$x^{\left\lceil\frac{n}{2}\right\rceil}$意义下的解\(f_{0}\left(x\right)\),要求模\(x^{n}\)意义下的解......
  • 多项式拟合模型
    多项式拟合模型一、多项式拟合数学模型多项式拟合是一种通过将数据拟合到多项式函数来建立数学模型的方法。该方法可以用于分析实验或观测数据中的关系,并用多项式函数来......
  • 函数拟合各方法比较(4次多项式-指数方程-4参数方程-拉格朗日-埃特金插值-Akima插值-三
    函数定义4次多项式: y=a*x*x*x+b*x*x+c*x+d指数方程: y=a*pow(e,b*x)+c4参数方程: y=(a-d)/(1+pow(x/c,b))+d其他为插值方式数据源数据源自热敏电阻的温度曲线, ......
  • 「matlab学习笔记」数据分析与多项式计算
    中国大学MOOC科学计算与MATLAB语言(点击此处跳转)MATLAB官方文档(点击此处跳转)5.1数据统计分析常用统计函数函数解释max()求向量或矩阵的最大元素min()求......
  • 如何在多项式时间内解决最大团问题
    如何在多项式时间内解决最大团问题本篇文章将会教你如何随机化硬草NP-Hard。SolutionA最大团问题有一个非常直观、简洁、但是错误的贪心做法:每次贪心地往当前最大团内......
  • 多项式的各类计算(多项式的逆/开根/对数/exp/带余除法/多点求值)
    预备知识:FFT/NTT多项式的逆给定一个多项式,请求出一个多项式,满足。系数对取模,首先将多项式的长度拓展至的次幂,然后我们要求的是假设已经求出了又因为有两式相减有因为......
  • 【笔记】本原多项式之积仍为本原多项式
    定义:多项式\(f(x)=\sum_{i=0}^{n}a_ix^i\)是本原多项式(primitivepolynomial),如果\(\gcd(a_0,\cdots,a_n)=1\)。结论:本原多项式之积仍为本原多项式。证明:WLOG,设\(f(x......
  • 多项式杂题
    多项式特训。开始大生产运动。不得不说黑题通过数一下就上来了。由于大多数比较工业所以一律不放代码。歌被咕了,打算报复性整点活。整活其实不一定需要整活用的曲。目前......