zoukankan      html  css  js  c++  java
  • 一些多项式的整理

    卷积

    (c=a otimes b)

    (c_i=sum_{j=0}^{i} a_j b_{i-j})

    卷积运算的性质也就是多项式乘法的性质:

    交换律:(a otimes b=b otimes a)

    结合律:((a otimes b) otimes c=a otimes (b otimes c))

    分配律:((a+b) otimes c=a otimes c+b otimes c)

    FFT

    用于优化两个多项式的卷积,时间复杂度(O(nlogn))

    struct node{
        double x,y;
        inline node operator + (const node &b)const{return (node){x+b.x,y+b.y};}
        inline node operator - (const node &b)const{return (node){x-b.x,y-b.y};}
        inline node operator * (const node &b)const{return (node){x*b.x-y*b.y,y*b.x+x*b.y};}
    }a[N],b[N];
    int pos[N];
    inline void init(){
        for (n=1;n<=na+nb;n<<=1,l++);
        For(i,1,n) pos[i]=(pos[i>>1]>>1)|((i&1)<<(l-1));
    }
    inline void FFT(node *a,int f){
        For(i,0,n-1) if (i<pos[i]) swap(a[i],a[pos[i]]);
        node x,y;
        for (register int i=1;i<n;i<<=1){
        	node wn=(node){cos(pi/i),f*sin(pi/i)};
            for (register int j=0;j<n;j+=i<<1){
            	node w=(node){1,0};
                for (register int k=0;k<i;k++,w=w*wn) x=a[j+k],y=a[j+i+k]*w,a[j+k]=x+y,a[j+i+k]=x-y;
            }
        }
        if (f==-1) For(i,0,n-1) a[i].x=a[i].x/n+0.5;
    }
    

    NTT

    用来处理有特定模数(如(998244353))的卷积,把(FFT)的单位复根换成原根。
    模数表

    const int mod = 998244353;
    inline int power(int a,int b){
    	int ret=1;
    	for (;b;b>>=1,a=1ll*a*a%mod) if (b&1) ret=1ll*ret*a%mod;
    	return ret;
    }
    inline int Mod(int x){return x=(x<0)?x+mod:x,x=(x>=mod)?x-mod:x,x;}
    inline void NTT(int n,vector<int>&a,int f){
    	a.resize(n);
    	For(i,0,n-1) if (i<pos[i]) swap(a[i],a[pos[i]]);
    	for (rt i=1;i<n;i<<=1){
            int wn=power(3,(mod-1)/2/i);
            for (rt j=0;j<n;j+=i<<1)
            	for (rt k=0,w=1;k<i;k++,w=1ll*w*wn%mod){
            		int x=a[j+k],y=1ll*w*a[j+k+i]%mod;
            		a[j+k]=Mod(x+y),a[j+k+i]=Mod(x-y);
            	}
    	}
    	if (f==-1){
    		reverse(a.begin()+1,a.end());
    		for (rt i=0,inv=power(n,mod-2);i<n;i++) a[i]=1ll*a[i]*inv%mod;
    	}
    }
    

    倍增FFT

    套个卡速米就行了。

    inline vector<int> Power(vector<int>a,int b){
    	vector<int> ret=a;b--;
    	for (;b;b>>=1,a=Mul(a,a)) if (b&1) ret=Mul(ret,a);
    	return ret;
    }
    

    分治FFT

    (f_i=sum_{j=1}^{i}f_{i-j}g_j)

    套个(CDQ)就行了。

    inline void Solve(int l,int r){
    	if (l==r) return;
    	int mid=l+r>>1;Solve(l,mid);
    	vector<int>A,B,C;
    	For(i,l,mid) A.push_back(f[i]);
    	For(i,0,r-l) B.push_back(g[i]);
    	C=Mul(A,B);
    	For(i,mid+1,r) f[i]=Mod(f[i]+C[i-l]);
    	Solve(mid+1,r);
    }
    

    多项式求逆

    咕咕咕

    多项式除法/取模

    咕咕咕

    多项式牛顿迭代法

    咕咕咕

    多项式开根

    咕咕咕

    多项式ln

    咕咕咕

    多项式exp

    咕咕咕

    咕咕咕的等会了再填坑...

  • 相关阅读:
    项目踩坑实记 :2019年(SSM 架构)
    多线程实践
    SpringCloud(一)之我学 Eureka
    JVM 第一次学习总结 --- 2019年4月
    《深入理解 JVM 虚拟机》 --- 看书笔记
    JVM 学习(二)Java 内存模型、方法内联、逃逸 --- 2019年4月
    JVM 学习(一)反射、垃圾回收、异常处理--- 2019年4月
    剑指offer-18.树的子结构
    剑指offer-17.合并两个有序链表
    剑指offer-16.翻转链表
  • 原文地址:https://www.cnblogs.com/zykykyk/p/10225812.html
Copyright © 2011-2022 走看看