首页 > 其他分享 >少项式技术

少项式技术

时间:2024-11-14 22:08:06浏览次数:1  
标签:少项 ++ 技术 poly int lhs vec size

其实就是一些平方暴力的多项式运算,以防某些人在数据范围允许平方时拍 NTT 上去。刚好出题用到了少项式技术就象征地总结一下。

普通幂少项式

单点求值

struct poly : vector<mint> {
  using vector::vector;
  mint operator()(const mint& x) const {
    auto&& f = *this;
    mint res = 0, now = 1;
    for (int i = 0; i < (int)f.size(); i++) res += now * f[i], now *= x - i;
    return res;
  }
};

整除与取模

将被除式的每一个高位,尝试用除式的某一倍数去减,使其消失。

poly operator/(poly lhs, const poly& rhs) {
  if (lhs.size() < rhs.size()) return {};
  mint iz = 1 / rhs.back();
  vector<mint> ret(lhs.size() - rhs.size() + 1);
  for (int i = (int)lhs.size() - 1; i >= (int)rhs.size() - 1; i--) {
    auto k = ret[i - rhs.size() + 1] = lhs[i] * iz;
    for (int j = 0; j < (int)rhs.size(); j++) lhs[i - j] -= rhs[rhs.size() - j - 1] * k;
  }
  return ret;
}

拉格朗日插值

根据不知道哪里来的实践经验,拉插特有的除二项式部分需要特别优化。

poly divide2(poly lhs, mint b) {
  vector<mint> ret(lhs.size() - 1);
  for (int i = (int)lhs.size() - 1; i >= 1; i--) {
    auto k = ret[i - 1] = lhs[i];
    lhs[i - 1] -= b * k;
  }
  return ret;
}
poly lagrange(const vector<pair<mint, mint>>& vec) {
  poly ans(vec.size()), prod{1};
  for (int i = 0; i < (int)vec.size(); i++) prod = prod * poly{0 - vec[i].first, 1};
  for (int i = 0; i < (int)vec.size(); i++) {
    mint den = 1;
    for (int j = 0; j < (int)vec.size(); j++) {
      if (i != j) den *= vec[i].first - vec[j].first;
    }
    auto num = divide2(prod, 0 - vec[i].first);
    auto k = vec[i].second / den;
    for (int j = 0; j < (int)vec.size(); j++) ans[j] += num[j] * k;
  }
  return ans;
}

对数与指数

【模板】子集卷积 - caijianhong - 博客园

根据求导公式比较两边系数。

下降幂少项式

单点求值

struct poly : vector<mint> {
  using vector::vector;
  mint operator()(const mint& x) const {
    auto&& f = *this;
    mint res = 0, now = 1;
    for (int i = 0; i < (int)f.size(); i++) res += now * f[i], now *= x - i;
    return res;
  }
};

普通幂转下降幂

使用第二类斯特林数。

从阶乘幂到斯特林数 - caijianhong - 博客园

poly nor2under(const poly& f) {
  poly g(f.size());
  for (int i = 0; i < (int)f.size(); i++) {
    for (int j = 0; j <= i; j++) g[j] += S[i][j] * f[i];
  }
  return g;
}
S[0][0] = 1;
for (int i = 1; i <= 2000; i++) {
  for (int j = 1; j <= i; j++) S[i][j] = S[i - 1][j] * j + S[i - 1][j - 1];
}

下降幂转普通幂

使用第一类斯特林数并携带某个系数。

poly under2nor(const poly& f) {
  poly g(f.size());
  for (int i = 0; i < (int)f.size(); i++) {
    for (int j = 0; j <= i; j++) g[j] += S1[i][j] * ((i - j) & 1 ? -1 : +1) * f[i];
  }
  return g;
}
S1[0][0] = 1;
for (int i = 1; i <= 2000; i++) {
  for (int j = 1; j <= i; j++) S1[i][j] = S1[i - 1][j] * (i - 1) + S1[i - 1][j - 1];
}

点值平移

\(f(x)\to f(x-b)\)。观察到下降幂也有二项式定理。

poly translate(const poly& f, int b) {
  poly g(f.size());
  for (int i = 0; i < (int)f.size(); i++) {
    mint now = 1;
    for (int j = 0; j <= i; j++) {
      g[i - j] += f[i] * binom(i, j) * now;
      now *= -b - j;
    }
  }
  return g;
}

有限微积分相关

有限微积分与数列求和 - 洛谷专栏

标签:少项,++,技术,poly,int,lhs,vec,size
From: https://www.cnblogs.com/caijianhong/p/18546947

相关文章

  • 狙击短线资金】副图指标使用技术图文教程,短线买卖更精准,通达信炒股软件指标
    如上图,副图指标【狙击短线资金】,副图指标上半部分监控资金多空区间以及强弱变化,下半部分追踪短线买卖机会和持股信号。如上图,副图指标的红色与绿色资金区域,对应行情的多头和空头。操作上,我们选择资金处于红色多头时的区间去操作。买点上,我们可以选在在副图指标下半部分......
  • 阅读2020-2023年《国外军用无人机装备技术发展综述》笔记_技术趋势
    目录文献基本信息序言1发展概况2 重点技术发展2.1人工智能技术2.1.1应用深化2.1.2 作战效能提升2.2 航空技术2.2.1螺旋桨设计创新2.2.2发射回收技术进步2.3 其他相关技术2.3.1远程控制技术探2.3.2 云地控制平台应用3装备系统进展3.1 无人作战飞机3......
  • 数字孪生如何赋能智慧能源?揭秘技术背后的核心价值
    随着能源行业不断向智能化、数字化转型,数字孪生技术在智慧能源项目中扮演的角色愈发重要。数字孪生不仅带来了前所未有的资源优化和成本节约方式,还为整个能源系统的可持续运营奠定了坚实基础。那么,为什么数字孪生技术在智慧能源项目中如此不可或缺?下面我就从可视化从业者的角度,来......
  • 第六章 网络互连与互联网(八):路由器技术
    八、路由器技术在因特网发展过程中,面临的一个问题就是IP地址短缺问题。解决这个问题有两种方案。长期的解决方案就是使用具有更大地址空间的IPv6协议。短期的解决方案有网络地址翻译(NAT)和无类别的域间路由技术(GIDR)等,这些技术都是在现有的IPv4路由器中实现的。1.NAT技......
  • 前端技术中对表格元素的学习
    表格元素目录表格元素rowspan(行合并)colspan(列合并)注意事项在HTML中,<table>表格元素允许你通过特定的属性来合并单元格。这通常用于创建更复杂的表格布局,比如跨越多行或多列的标题或数据。合并单元格可以通过rowspan和colspan属性来实现。rowspan(行合并)rowspan属性用于合并垂......
  • 【AI换脸整合包及教程】FaceFusion 3.0.0:AI换脸技术的新高度
    一、引言在当今数字化时代,AI技术不断发展并渗透到各个领域,其中AI换脸技术尤为引人注目。FaceFusion3.0.0作为这一领域的代表性工具,正引领着新的潮流。二、FaceFusion3.0.0的功能特点高度精确的换脸效果FaceFusion3.0.0利用先进的深度学习算法,能够精确地分析源脸和目标......
  • 企业级工位管理:Spring Boot技术突破
    2相关技术2.1MYSQL数据库MySQL是一个真正的多用户、多线程SQL数据库服务器。是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常适用于Web站点或者其他......
  • 基于SpringBoot的信息技术知识竞赛系统
    关注底部领取源码源码编号:S321源码名称:基于SpringBoot的信息技术知识竞赛系统用户类型:双角色,用户、管理员主要技术:Java、Vue、ElementUl、SpringBoot运行环境:Windows/Mac、JDK1.8及以上运行工具:IDEA/Eclipse数 据 库:MySQL5.7及以上版本数据库表数量:16张表是否有......
  • CCF - 网易雷火基金项目成果:基于大小模型协同的低资源标注技术|CNCC 2024 演讲实录
    在科技蓬勃发展的时代浪潮中,人工智能领域的每一次突破都离不开持续的科研投入和对前沿技术的不懈探索。2023年,网易伏羲与中国计算机学会(CCF)共同发起了“CCF-网易雷火联合基金”,致力于发挥和利用多方资源优势,加强与海内外青年学者的科研合作,促进中国人工智能等领域尖端技术产业......
  • 现代网络安全:关键技术与实战策略
    ......