首页 > 其他分享 >多项式运算封装

多项式运算封装

时间:2025-01-18 20:22:35浏览次数:1  
标签:封装 运算 int 多项式 res const define vint mod

动态更新。

#include <bits/stdc++.h>
#define int long long
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define il inline
#define rg register

using namespace std;

inline int read()
{
    int w=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        w=(w<<1)+(w<<3)+(ch^48);
        ch=getchar();
    }
    return w*f;
}
void write(int x)
{
    if(x<0) x=-x;
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
const int N=4e6+10;
int n,m;
il int qpow(int a,int b,const int mod)
{
    rg int res=1;
    while(b)
    {
        if(b&1) res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
namespace poly
{
    const int g=114514,mod=998244353;
    const int inv_g=qpow(g,mod-2,mod);
    #define vint vector<int>
    #define sz(a) ((int)a.size())
    vint split(vint a,int n)
    {
        a.resize(n,0);
        return a;
    }
    void print(vint f)
    {
        for(int i:f)
        {
            cout<<i<<" ";
        }
        cout<<endl;
    }
    void NTT(vint& f)
    {
        int n=sz(f);
        if(n==1) return;
        vint f1(n/2,0),f2(n/2,0);
        for(rg int i=0;i<n/2;++i)
        {
            f1[i]=f[i<<1],f2[i]=f[i<<1|1];
        }
        NTT(f1),NTT(f2);
        int g_i=qpow(g,(mod-1)/n,mod),gk=1;
        for(int i=0;i<sz(f2);++i)
        {
            (f[i]=(f1[i]+f2[i]*gk)%mod)%=mod;
            (f[i+n/2]=(mod+(f1[i]-f2[i]*gk)%mod)%mod)%=mod;
            gk=g_i*gk%mod;
        }
    }
    void INTT(vint& f)
    {
        NTT(f);
        auto it=f.begin();
        ++it;
        reverse(it,f.end());
    }
    vint operator *(vint a,vint b)
    {
        int n=a.size(),m=b.size();
        vint res(n+m-1,0);
        int len=1;
        while(len<=n+m-2) len<<=1;
        int inv_len=qpow(len,mod-2,mod); 
        a.resize(len,0),b.resize(len,0);
        NTT(a),NTT(b);
        
        for(int i=0;i<len;++i)
        {
            a[i]=a[i]*b[i]%mod;
        }
        
        INTT(a);
        for(int i=0;i<=n+m-2;++i)
        {
            res[i]=a[i]*inv_len%mod;
        }
        return res;
    }
    vint operator +(vint a,vint b)
    {
        int len=max(sz(a),sz(b));
        vint res(len,0);
        a.resize(len,0),b.resize(len,0);
        for(rg int i=0;i<len;++i)
        {
            res[i]=(a[i]+b[i])%mod;
        }
        return res;
    }
    vint operator -(vint a,vint b)
    {
        int len=max(sz(a),sz(b));
        vint res(len,0);
        a.resize(len,0);
        b.resize(len,0);
        for(rg int i=0;i<len;++i)
        {
            res[i]=((a[i]-b[i])%mod+mod)%mod;
        }
        return res;
    }
    vint operator *(const vint a,int b)
    {
        vint res(a.size(),0);
        for(rg int i=0;i<sz(a);++i)
        {
            res[i]=a[i]*b%mod;
        }
        return res;
    }
    vint inv(vint a)
    {
        int n=sz(a);
        if(n==1) return vint{qpow(a[0],mod-2,mod)};
        vint b=inv(split(a,(n+1)>>1));
        vint p1=b*2,p2=a*b*b;
        return split(p1-p2,n);
    }
}
using namespace poly;

vint a,b;
signed main()
{
    n=read();
    a.resize(n,0);
    for(int i=0;i<n;++i) a[i]=read();
    b=inv(a);
    print(b);
    return 0;
}

标签:封装,运算,int,多项式,res,const,define,vint,mod
From: https://www.cnblogs.com/vanueber/p/18678790

相关文章

  • 卷积运算
      对应位置数字相乘,求和。  卷积核(或滤波器)的小窗口在输入数据上滑动,计算窗口覆盖区域的元素乘积之和,从而生成输出数据。二维卷积运算    1x7+2x6+3x5+4x4=50   1x6+2x2+3x4+4x2=30        彩色图像卷积运算; ......
  • 碳化硅MOS驱动要领、PFC/LLC各种拓扑结构应用及材料封装特性
    碳化硅MOS具有宽带隙、高击穿电场强度、高电流密度、快速开关速度、低导通电阻和抗辐射性能等独特特点,在电子器件领域有着广泛的应用。特别是在电力电子、高温电子、光伏逆变器和高频电子等领域,其性能优势能够提高器件的功率密度、效率和稳定性。碳化硅MOS驱动设计-CSDN创作中......
  • 多项式算法初探:从 FFT 到 FWT(目前只有FFT)
    多项式一向是算法竞赛中相当博大精深的东西,作为一个蒟蒻,我将会以最大的努力完成这篇记录,以防自己以后看不懂qwq。FFT(快速傅里叶变换)FFT是一种可以在\(O(n\logn)\)的时间内完成多项式乘法的算法。这个算法的劣势在于精度。我将会从复数、DFT、FFT和IFFT四个部分完成对......
  • 滑动窗口+位运算
    Problem:或值至少为K的最短子数组II思路终究还是用到了滑动窗口,暴力枚举在上一题点击查看CodeclassSolution{publicintminimumSubarrayLength(int[]nums,intk){intn=nums.length; //用数组去模拟当前或的结果的各位对应1的个数,依据题目范围,30......
  • STL容器封装常见问题分析解决方法总结
    一、问题简介    在C++的开发工作中,经常会将STL的标准容器进行一层封装,以满足更高级的需求,如支持外部内存等。在封装容器时,容易出现问题的地方包括容器的元素运算符以及容器的内存分配器,本人在做相关的工作时,将上述两方面所遇到问题的分析解决方法进行了如下总结。二、问......
  • 多项式相关
    我学科技?真的假的?起因是在做斯特林数,发现没事就要佛佛塔或者呢塔塔,遂学之。FFT多项式乘法现在要求两个多项式的卷积。卷积现在给你两个序列\(a_i,b_i\)并定义\(c_i\)为\[c_i=\sum_{p+q=i}a_ib_i\]可以认为\(c_i\)就是\(a_i,b_i\)的卷积。换句话说就是给你两个多项......
  • Java初学者笔记-01、封装继承多态
    封装:封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。通过封装,可以将类的信息隐藏在类内部,只暴露对外的接口(如setter和getter方法),从而提高代码的安全性和可维护性。继承:继承是从已有的类中派生出新的类的过程。新的类(子类)能够吸收已有类(父类)的数据属性和行为,并且可以......
  • 位运算练习
    判断字符是否唯一面试题01.01.判定字符是否唯一-力扣(LeetCode)思路此题可以用位运算解决,我们这里使用位图。位图:即定义一个数字将其转换为32个二进制位,将其初始化为0,每个字母代表一位,判断每个位置是否为1,如果为0,则将其加一(相当于记录此位置存在一种字母);如果为1,则之前这......
  • 按位或运算
    Problem:3095.或值至少K的最短子数组I思路用枚举子数组的方法,暴力Codeclass Solution {    public int minimumSubarrayLength(int[] nums, int k) {        int count = 60;        int n = nums.length;        boolean......
  • 使用python+pytest+requests完成自动化接口测试(包括html报告的生成和日志记录以及层级
    一、API的选择我们进行接口测试需要API文档和系统,我们选择JSONPlaceholder免费API,因为它是一个非常适合进行接口测试、API测试和学习的工具。它免费、易于使用、无需认证,能够快速帮助开发者模拟常见的接口操作(增、删、改、查)。尤其对于我你们学习接口测试的初学开发者来说,它......