整理的算法模板合集: ACM模板


目录

  • 【模板】P5265 多项式反三角函数

点我看多项式全家桶(●^◡_◡◡​^●)

【模板】P5265 多项式反三角函数

P5265 多项式反三角函数

前置函数多项式求逆,多项式开方,多项式乘法。

然后按照推出来的公式随便写写就A了

//#pragma GCC optimize(2)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;const int N = 3000007;
const int p = 998244353, gg = 3, ig = 332738118, img = 86583718;
const int mod = 998244353;template <typename T>void read(T &x)
{x = 0;register int f = 1;register char ch = getchar();while(ch < '0' || ch > '9') {if(ch == '-')f = -1;ch = getchar();}while(ch >= '0' && ch <= '9') {x = x * 10 + ch - '0';ch = getchar();}x *= f;
}int qpow(int a, int b)
{int res = 1;while(b) {if(b & 1) res = 1ll * res * a % mod;a = 1ll * a * a % mod;b >>= 1;}return res;
}namespace Poly
{#define mul(x, y) (1ll * x * y >= mod ? 1ll * x * y % mod : 1ll * x * y)#define minus(x, y) (1ll * x - y < 0 ? 1ll * x - y + mod : 1ll * x - y)#define plus(x, y) (1ll * x + y >= mod ? 1ll * x + y - mod : 1ll * x + y)#define ck(x) (x >= mod ? x - mod : x)//取模运算太慢了typedef vector<int> poly;const int G = 5;const int inv_G = qpow(G, mod - 2);int RR[N], deer[2][19][N], inv[N];void init(const int t) {//预处理出来NTT里需要的w和wn,砍掉了一个log的时间for(int p = 1; p <= t; ++ p) {int buf1 = qpow(G, (mod - 1) / (1 << p));int buf0 = qpow(inv_G, (mod - 1) / (1 << p));deer[0][p][0] = deer[1][p][0] = 1;for(int i = 1; i < (1 << p); ++ i) {deer[0][p][i] = 1ll * deer[0][p][i - 1] * buf0 % mod;//逆deer[1][p][i] = 1ll * deer[1][p][i - 1] * buf1 % mod;}}inv[1] = 1;for(int i = 2; i <= (1 << t); ++ i)inv[i] = 1ll * inv[mod % i] * (mod - mod / i) % mod;}int NTT_init(int n) {//快速数论变换预处理int limit = 1, L = 0;while(limit < n) limit <<= 1, L ++ ;for(int i = 0; i < limit; ++ i)RR[i] = (RR[i >> 1] >> 1) | ((i & 1) << (L - 1));return limit;}void NTT(poly &A, int type, int limit) {//快速数论变换A.resize(limit);for(int i = 0; i < limit; ++ i)if(i < RR[i])swap(A[i], A[RR[i]]);for(int mid = 2, j = 1; mid <= limit; mid <<= 1, ++ j) {int len = mid >> 1;for(int pos = 0; pos < limit; pos += mid) {int *wn = deer[type][j];for(int i = pos; i < pos + len; ++ i, ++ wn) {int tmp = 1ll * (*wn) * A[i + len] % mod;A[i + len] = ck(A[i] - tmp + mod);A[i] = ck(A[i] + tmp);}}}if(type == 0) {for(int i = 0; i < limit; ++ i)A[i] = 1ll * A[i] * inv[limit] % mod;}}poly poly_mul(poly A, poly B) {//多项式乘法int deg = A.size() + B.size() - 1;int limit = NTT_init(deg);poly C(limit);NTT(A, 1, limit);NTT(B, 1, limit);for(int i = 0; i < limit; ++ i)C[i] = 1ll * A[i] * B[i] % mod;NTT(C, 0, limit);C.resize(deg);return C;}poly poly_inv(poly &f, int deg) {//多项式求逆if(deg == 1)return poly(1, qpow(f[0], mod - 2));poly A(f.begin(), f.begin() + deg);poly B = poly_inv(f, (deg + 1) >> 1);int limit = NTT_init(deg << 1);NTT(A, 1, limit), NTT(B, 1, limit);for(int i = 0; i < limit; ++ i)A[i] = B[i] * (2 - 1ll * A[i] * B[i] % mod + mod) % mod;NTT(A, 0, limit);A.resize(deg);return A;}poly poly_dev(poly f) {//多项式求导int n = f.size();for(int i = 1; i < n; ++ i) f[i - 1] = 1ll * f[i] * i % mod;return f.resize(n - 1), f;//f[0] = 0,这里直接扔了,从1开始}poly poly_idev(poly f) {//多项式求积分int n = f.size();for(int i = n - 1; i ; -- i) f[i] = 1ll * f[i - 1] * inv[i] % mod;return f[0] = 0, f;}poly poly_ln(poly f, int deg) {//多项式求对数poly A = poly_idev(poly_mul(poly_dev(f), poly_inv(f, deg)));return A.resize(deg), A;}poly poly_exp(poly &f, int deg) {//多项式求指数if(deg == 1)return poly(1, 1);poly B = poly_exp(f, (deg + 1) >> 1);B.resize(deg);poly lnB = poly_ln(B, deg);for(int i = 0; i < deg; ++ i)lnB[i] = ck(f[i] - lnB[i] + mod);int limit = NTT_init(deg << 1);//n -> n^2NTT(B, 1, limit), NTT(lnB, 1, limit);for(int i = 0; i < limit; ++ i)B[i] = 1ll * B[i] * (1 + lnB[i]) % mod;NTT(B, 0, limit);B.resize(deg);return B;}poly poly_sqrt(poly &f, int deg) {//多项式开方if(deg == 1) return poly(1, 1);poly A(f.begin(), f.begin() + deg);poly B = poly_sqrt(f, (deg + 1) >> 1);poly IB = poly_inv(B, deg);int limit = NTT_init(deg << 1);NTT(A, 1, limit), NTT(IB, 1, limit);for(int i = 0; i < limit; ++ i)A[i] = 1ll * A[i] * IB[i] % mod;NTT(A, 0, limit);for(int i =0; i < deg; ++ i)A[i] = 1ll * (A[i] + B[i]) * inv[2] % mod;A.resize(deg);return A;}poly poly_pow(poly f, int k) {//多项式快速幂f = poly_ln(f, f.size());for(auto &x : f) x = 1ll * x * k % mod;return poly_exp(f, f.size());}poly poly_cos(poly f, int deg) {//多项式三角函数(cos)poly A(f.begin(), f.begin() + deg);poly B(deg), C(deg);for(int i = 0; i < deg; ++ i)A[i] = 1ll * A[i] * img % mod;B = poly_exp(A, deg);C = poly_inv(B, deg);int inv2 = qpow(2, mod - 2);for(int i = 0; i < deg; ++ i)A[i] = 1ll * (1ll * B[i] + C[i]) % mod * inv2 % mod;return A;}poly poly_sin(poly f, int deg) {//多项式三角函数(sin)poly A(f.begin(), f.begin() + deg);poly B(deg), C(deg);for(int i = 0; i < deg; ++ i)A[i] = 1ll * A[i] * img % mod;B = poly_exp(A, deg);C = poly_inv(B, deg);int inv2i = qpow(img << 1, mod - 2);for(int i = 0; i < deg; ++ i)A[i] = 1ll * (1ll * B[i] - C[i] + mod) % mod * inv2i % mod;return A;}poly poly_arcsin(poly f, int deg) {poly A(f.size()), B(f.size()), C(f.size());A = poly_dev(f);B = poly_mul(f, f);for(int i = 0; i < deg; ++ i)B[i] = minus(mod, B[i]);B[0] = plus(B[0], 1);C = poly_sqrt(B, deg);C = poly_inv(C, deg);C = poly_mul(A, C);C = poly_idev(C);return C;}poly poly_arctan(poly f, int deg) {poly A(f.size()), B(f.size()), C(f.size());A = poly_dev(f);B = poly_mul(f, f);B[0] = plus(B[0], 1);C = poly_inv(B, deg);C = poly_mul(A, C);C = poly_idev(C);return C;}
}using Poly::poly;
using Poly::poly_arcsin;
using Poly::poly_arctan;int n, m, x, k, type;
poly f, g;
char s[N];int main()
{Poly::init(18);//2^21 = 2,097,152,根据题目数据多项式项数的大小自由调整,注意大小需要跟deer数组同步(21+1=22)read(n), read(type);for(int i = 0; i < n; ++ i)read(x), f.push_back(x);if(type == 0) g = poly_arcsin(f, n);else g = poly_arctan(f, n);for(int i = 0; i < n; ++ i)printf("%d ", g[i]);return 0;
}

【学习笔记】超简单的多项式反三角函数(含全套证明)相关推荐

  1. Unity学习笔记--超简单:两个游戏对象直接用线连接(UI和世界坐标下均可)

    目录 UI用 效果图 UI代码示例 挂载示例 世界坐标用 挂载示例 效果图 世界坐标代码示例 我们分两种情况,一种是UI上连线,一种是世界坐标下连线. UI用 效果图 UI代码示例 public cl ...

  2. 论文学习笔记: Learning Multi-Scale Photo Exposure Correction(含pytorch代码复现)

    论文学习笔记: Learning Multi-Scale Photo Exposure Correction--含pytorch代码复现 本章工作: 论文摘要 训练数据集 网络设计原理 补充知识:拉普 ...

  3. python自训练神经网络_tensorflow学习笔记之简单的神经网络训练和测试

    本文实例为大家分享了用简单的神经网络来训练和测试的具体代码,供大家参考,具体内容如下 刚开始学习tf时,我们从简单的地方开始.卷积神经网络(CNN)是由简单的神经网络(NN)发展而来的,因此,我们的第 ...

  4. VC学习笔记:简单绘图

    VC学习笔记:简单绘图 SkySeraph Oct.29th 2009  HQU Email-zgzhaobo@gmail.com  QQ-452728574 Latest Modified Date ...

  5. STM32F429I-Discovery学习笔记--(1)简单上手和官方例程的下载与使用

    STM32F429I-Discovery学习笔记–(1)简单上手和官方例程的下载与使用 到手测试 收到开发板后我们要首先检查一下外观有没有磕碰破损,排针是否发生弯折,重要的是看一下JP3和CN4处的跳 ...

  6. Tensorflow2学习笔记:简单灰度图分类

    Tensorflow2学习笔记:简单灰度图分类 相关介绍 实验环境 实验步骤 导入相关库 导入数据集 浏览数据 预处理数据 构建模型 设置层 编译模型 训练模型 向模型馈送数据 评估准确率 进行预测 ...

  7. PointNet学习笔记(二)——支撑材料(理论证明)

    PointNet学习笔记(二)--支撑材料(理论证明) 这一部分记录了PointNet中两个定理的证明和博主的学习笔记.具体的定理可以参见论文学习笔记,这里仅给出证明.更新于2018.10.12. 文 ...

  8. 【学习笔记】超简单的快速傅里叶变换(FFT)(含全套证明)

    整理的算法模板合集: ACM模板 目录 一.概念概述 二.前置知识 1. 多项式 2. 复数 4. 欧拉公式证明 3. 复数的单位根 / 单位向量 三.FFT 算法概述 四.离散傅里叶变换(DFT) ...

  9. 【学习笔记】超简单的快速数论变换(NTT)(FFT的优化)(含全套证明)

    整理的算法模板合集: ACM模板 目录 一.前置知识 二.快速数论变换(NTT) 三.NTT证明(和FFT的关系) 四.NTT模板 数组形式的实现 vector形式的实现 点我看多项式全家桶(●^◡_ ...

最新文章

  1. 卸载Notepad++!事实已证明,它更牛逼……
  2. Java学习日记----反射
  3. BZOJ3930-莫比乌斯反演+杜教筛
  4. js中将时间字符串转换为时间戳
  5. Yii框架官方教程增补篇3——开始:创建第一个Yii应用
  6. Bailan4142 二分法求函数的零点【二分法】
  7. StringUtils 方法介绍(转载)
  8. matlab二次曲线插补,圆弧插补器插补非圆二次曲线的方法
  9. eterm显示未连接服务器,eterm一直显示未链接服务器
  10. 简述数字信号处理的内容和理论
  11. crontab任务误删恢复及备份步骤
  12. A53系统移植、内核、文件系统
  13. Xamarin 设置ListView组头的高度
  14. 观光公交削弱_削弱Web开发人员和Internet的7大障碍
  15. Shell修改IP地址
  16. python IDE环境
  17. Vue路由懒加载(resolve),嵌套路由 3
  18. 炼钢-连铸生产动态调度模型(加启发式算法步骤)
  19. 【扫盲】史上最全的互联网专业词语汇总!
  20. keithley 2100 软件|keithley2400测试软件NS-SourceMeter

热门文章

  1. Pytorch中的5个非常有用的张量操作
  2. MyBatis整合第三方缓存
  3. javascript_core_01之数据类型与运算
  4. ubuntu如何打开命令行
  5. Android短信的发送和广播接收者实现短信的监听
  6. 论网络营销在我国的发展
  7. Cruise Control
  8. mysql json类型数组索引_MySQL JSON 类型数据操作
  9. matlab title多个标题_Matlab画图,只需要这几步
  10. es dsl java api_ElasticSearch 系列 - RestFulAPI(DSL)