设为首页 加入收藏

TOP

cf438E. The Child and Binary Tree(生成函数 多项式开根 多项式求逆)(二)
2019-03-13 18:08:31 】 浏览:152
Tags:cf438E. The Child and Binary Tree 生成 函数 多项
a[i]; for(int i = 0; i <= M; i++) B[i] = b[i]; NTT(A, lim, 1); NTT(B, lim, 1); for(int i = 0; i <= lim; i++) B[i] = mul(B[i], A[i]); NTT(B, lim, -1); for(int i = 0; i <= N + M; i++) b[i] = B[i]; memset(A, 0, sizeof(A)); memset(B, 0, sizeof(B)); } void Inv(int *a, int *b, int len) {//B1 = 2B - A1 * B^2 if(len == 1) {b[0] = fp(a[0], mod - 2); return ;} Inv(a, b, len >> 1); for(int i = 0; i < len; i++) A[i] = a[i], B[i] = b[i]; NTT(A, len << 1, 1); NTT(B, len << 1, 1); for(int i = 0; i < (len << 1); i++) mul2(A[i], mul(B[i], B[i])); NTT(A, len << 1, -1); for(int i = 0; i < len; i++) add2(b[i], add(b[i], -A[i])); for(int i = 0; i < (len << 1); i++) A[i] = B[i] = 0; } void Dao(int *a, int *b, int len) { for(int i = 1; i < len; i++) b[i - 1] = mul(i, a[i]); b[len - 1] = 0; } void Ji(int *a, int *b, int len) { for(int i = 1; i < len; i++) b[i] = mul(a[i - 1], fp(i, mod - 2)); b[0] = 0; } void Ln(int *a, int *b, int len) {//G(A) = \frac{A}{A'} qiudao zhihou jifen static int A[MAXN], B[MAXN]; Dao(a, A, len); Inv(a, B, len); NTT(A, len << 1, 1); NTT(B, len << 1, 1); for(int i = 0; i < (len << 1); i++) B[i] = mul(A[i], B[i]); NTT(B, len << 1, -1); Ji(B, b, len << 1); memset(A, 0, sizeof(A)); memset(B, 0, sizeof(B)); } void Exp(int *a, int *b, int len) {//F(x) = F_0 (1 - lnF_0 + A) but code ..why.... if(len == 1) return (void) (b[0] = 1); Exp(a, b, len >> 1); Ln(b, C, len); C[0] = add(a[0] + 1, -C[0]); for(int i = 1; i < len; i++) C[i] = add(a[i], -C[i]); NTT(C, len << 1, 1); NTT(b, len << 1, 1); for(int i = 0; i < (len << 1); i++) mul2(b[i], C[i]); NTT(b, len << 1, -1); for(int i = len; i < (len << 1); i++) C[i] = b[i] = 0; } void Sqrt(int *a, int *b, int len) { static int B[MAXN]; Ln(a, B, len); for(int i = 0; i < len; i++) B[i] = mul(B[i], INV2); Exp(B, b, len); } }; using namespace Poly; signed main() { N = read(); M = read(); int Lim = GetLen(M); Init(4 * Lim); for(int i = 1; i <= N; i++) a[i] = read(); for(int i = 1; i <= N; i++) b[a[i]] = (-4 + mod); add2(b[0], 1); Sqrt(b, c, Lim); add2(c[0], 1); Inv(c, d, Lim); for(int i = 1; i <= M; i++) cout << mul(2, d[i]) << '\n'; return 0; }
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【1】简单计算器(栈) 下一篇洛谷P4841 城市规划(生成函数 多..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目