首页 > 其他分享 >多项式模板

多项式模板

时间:2024-10-27 17:00:51浏览次数:4  
标签:sz return get int 多项式 poly 模板 mod

#include <bits/stdc++.h>
#define For(i, x, y) for (int i = (x); i <= (y); i ++)
#define sz(v) (int)(v.size())
using namespace std;
int ksm(int x, int y, int p) {
    int v = 1; x %= p;
    while (y) v = 1ll * v * ((y & 1) ? x : 1) % p, x = 1ll * x * x % p, y >>= 1;
    return v % p;
}
namespace Poly {
	typedef vector< int > poly;
	const int mod = 998244353, G = 3, invG = ksm(3, mod - 2, mod);
	vector< int > id;
	poly get (poly a, int n) {
		a.resize(n, 0);
		return a;
	}
	poly NTT (poly a, int op) {
		int n = sz(a);
		For (i, 0, n - 1) if (i < id[i]) swap(a[i], a[id[i]]);
		for (int k = 1; k < n; k <<= 1) {
			int wn = ksm(op == 1 ? G : invG, (mod - 1) / (k << 1), mod);
			for (int i = 0; i < n; i += (k << 1)) {
				int w = 1;
				for (int j = 0; j < k; j ++, w = 1ll * w * wn % mod) {
					int x = a[i + j], y = 1ll * w * a[i + j + k] % mod;
					a[i + j] = (x + y) % mod; a[i + j + k] = (x - y + mod) % mod;
				}
			}
		}
		if (op == -1) {
			int val = ksm(n, mod - 2, mod);
			For (i, 0, n - 1) a[i] = 1ll * a[i] * val % mod;
		}
		return a;
	}
	poly operator * (poly a, poly b) {
		int n = sz(a), m = sz(b), k = 0;
		while ((1 << k) <= n + m - 2) k ++;
		id.resize(1 << k);
		For (i, 1, (1 << k) - 1) id[i] = ((id[i >> 1] >> 1) | ((i & 1) << (k - 1)));
		a.resize(1 << k, 0); b.resize(1 << k, 0); a = NTT(a, 1); b = NTT(b, 1);
		For (i, 0, (1 << k) - 1) a[i] = 1ll * a[i] * b[i] % mod;
		a = NTT(a, -1); a.resize(n + m - 1, 0);
		return a;
	}
	poly operator + (poly a, poly b) {
		int n = sz(a), m = sz(b); n = max(n, m); a.resize(n, 0); b.resize(n, 0);
		For (i, 0, n - 1) a[i] += b[i], (a[i] >= mod) && (a[i] -= mod);
		return a;
	}
	poly operator - (poly a, poly b) {
		int n = sz(a), m = sz(b); n = max(n, m); a.resize(n, 0); b.resize(n, 0);
		For (i, 0, n - 1) a[i] += mod - b[i], (a[i] >= mod) && (a[i] -= mod);
		return a;
	}
	poly mul (poly a, int v) {
		for (int &x : a) x = 1ll * x * v % mod;
		return a;
	}
	poly inv (poly a) {
		int n = sz(a);
		if (n == 1) return poly{ksm(a[0], mod - 2, mod)};
		poly b = inv(get(a, (n + 1) >> 1));
		return get(mul(b, 2) - a * b * b, n);
	}
	poly deriv (poly a) {
		int n = sz(a); poly b(n - 1);
		For (i, 0, n - 2) b[i] = 1ll * (i + 1) * a[i + 1] % mod;
		return b;
	}
	poly integ (poly a) {
		int n = sz(a); poly b(n + 1, 0);
		For (i, 1, n) b[i] = 1ll * a[i - 1] * ksm(i, mod - 2, mod) % mod;
		return b;
	}
	poly ln (poly a) {
		return integ(get(deriv(a) * inv(a), sz(a) - 1));
	} 
	poly exp (poly a, int n = 0) {
		if (sz(a) == 1) return poly{1};
		if (!n) n = sz(a);
		const poly b = exp(get(a, (sz(a) + 1) >> 1), sz(a));
		return get(b * (a - ln(b)) + b, n);
	}
	poly operator ^ (poly a, int k) {
		return exp(mul(ln(a), k));
	}
}
using namespace Poly;
int main () {
    ios :: sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
	return 0;
}

标签:sz,return,get,int,多项式,poly,模板,mod
From: https://www.cnblogs.com/lycc2009/p/18508610

相关文章

  • P3370 【模板】字符串哈希
    【模板】字符串哈希题目描述如题,给定NNN个字符串(第iii个字符......
  • 解析 Vue 模板的本质:从语法糖到渲染过程
    大家耳熟能详的表述如下:Vue模板的本质其实是一种声明式渲染的形式,它在开发过程中提供了将组件的结构与逻辑分离的便利。也就是说,模板template的存在只是为了让我们以更直观的方式描述界面的结构,然而在运行时,模板其实是不存在的,它在底层会被Vue编译为更高效的渲染函数......
  • PbootCMS模板当前栏目标签
    当前栏目标签适用范围:在列表页或详情页使用。标签作用:用于输出当前栏目的相关信息。示例代码:html {sort:tcode}当前栏目的顶级栏目编码{sort:topname}当前栏目的顶级栏目名称{sort:toplink}当前栏目的顶级栏目链接{sort:pcode}当前栏目的父栏目编码{sort:parentname......
  • Ajax:表单 & 模板引擎
    Ajax:表单&模板引擎form表单form属性Ajax操控表单事件监听阻止默认行为收集表单数据模板引擎art-template{{}}语法原文输出条件输出循环输出过滤器原理form表单在HTML中,可以通过<form>创建一个表单,收集用户信息。而采集到的信息想要发送给后端,此时就要与Aj......
  • CSP-S可能出现的模板(手抄版)
    CSP-Srp+++++++++++ǰ����ʾ,��ƪ���´���ע��~��ѧ������intksm(inta,intb,intp){intret=1;while(b){if(b&1)ret=(ret*a)%p;a=(a*a)%p;b=b>>1;}returnret;}//b��λö�������λΪ1�������aÿ��a�˷�Lucasint......
  • pbootcms模板上线推广百度竞价后打不开网站出现404错误
    PbootCMSV3.2.5版本中为了增强安全性或优化URL结构,加入了对URL参数的严格判断。当URL中包含?但不符合特定条件(如/?tag=、/?page=、/?ext_)时,系统会自动返回404错误页面。这种做法虽然有助于防止一些非法请求,但也可能导致合法的请求被误判为无效,特别是对于那些依赖于其他查询参数......
  • CSP-S 可能出现的模板(非原创,各个地方整理得)
    CSP-Srp+++++++++++数据结构~01trie~intt[N*31][2],nv=1;voidbuild(intp,intd,intv){ boolflag=(v&(1<<d)); if(!t[p][flag])t[p][flag]=++nv; if(d)build(t[p][flag],d-1,v);}intquery(intp,intd,intv){ if(d<0)return0; boolflag=(v&am......
  • Tarjan连通性算法模板大整合
    更新日志前言由于Tarjan算法页面过多,这里统一做一个整合,后期可能还会加入或者更改这里的模板。另外的,这个页面只提供模板——以及链接,详细讲解点链接即可。强连通(有向图,储存每个节点属于的分量编号)intscnt;intscc[N],siz[N];intdcnt;intdfn[N],low[N];boolins[N......
  • C++之内存管理与模板初级
    内容介绍Ⅰ.C++内存管理1.C/C++内存分布2.C与C++动态内存管理方式对比2.1C中动态内存管理方式2.2C++中内存管理方式3.new和delete的底层实现原理(了解)Ⅱ.模板初阶1.模板介绍2.函数模板3.函数模板参数匹配原则4.类模板Ⅰ.C++内存管理1.C/C++内存分布intn1=1;......
  • 浅拷贝与深拷贝 以及嵌套和递归使用模板类
     1.浅拷贝和深拷贝——对象和类浅拷贝浅拷贝只复制对象的基本属性,而不复制引用类型的属性指向的对象,即只复制引用而不复制引用指向的对象在浅拷贝中,新对象与原始对象共享引用类型的属性指向的对象,即它们指向同一个对象。编译器提供的拷贝构造函数是浅拷贝,当一个对象修......