7.6-7.12

本文介绍了如何将普通多项式转换为下降幂多项式,以及下降幂多项式之间的转换和乘法。利用斯特林数的性质,通过多点求值和卷积计算来实现这些操作。此外,还探讨了LuoguP5667题目中的拉格朗日插值问题,通过平移处理负下标,简化为卷积计算。
摘要由CSDN通过智能技术生成
普通多项式转下降幂多项式

由斯特林数基本性质,有
x n = ∑ i = 0 n i ! ( x i ) S ( n , i ) = ∑ i = 0 n S ( n , i ) x i ‾ x^n = \sum_{i = 0}^ni!\binom{x}{i}S(n,i) = \sum_{i = 0}^nS(n,i)x^{\underline{i}} xn=i=0ni!(ix)S(n,i)=i=0nS(n,i)xi
所以
∑ i = 0 n a i x i = ∑ i = 0 n a i ∑ j = 0 i S ( i , j ) x j ‾ = ∑ i = 0 n x i ‾ ∑ j = i n a j S ( j , i ) \sum_{i = 0}^na_ix^i = \sum_{i = 0}^na_i\sum_{j = 0}^iS(i,j)x^{\underline{j}} = \sum_{i = 0}^nx^{\underline{i}}\sum_{j = i}^na_jS(j,i) i=0naixi=i=0naij=0iS(i,j)xj=i=0nxij=inajS(j,i)
j < i j < i j<i S ( j , i ) = 0 S(j,i) = 0 S(j,i)=0,故 j j j可以从 0 0 0开始枚举,问题转化为求
b i = ∑ j = 0 n a j S ( j , i ) b_i = \sum_{j = 0}^na_jS(j,i) bi=j=0najS(j,i)

S ( n , m ) = 1 m ! ∑ i = 0 m ( − 1 ) i ( m i ) ( m − i ) n = ∑ i = 0 m ( − 1 ) i i ! ( m − i ) n ( m − i ) ! S(n,m) = \frac{1}{m!}\sum_{i = 0}^m(-1)^i\binom{m}{i}(m - i)^n = \sum_{i = 0}^m\frac{(-1)^i}{i!}\frac{(m - i)^n}{(m - i)!} S(n,m)=m!1i=0m(1)i(im)(mi)n=i=0mi!(1)i(mi)!(mi)n
带入,得
b i = ∑ j = 0 n a j ∑ k = 0 i ( − 1 ) k k ! ( i − k ) j ( i − k ) ! = ∑ j = 0 i ( − 1 ) j j ! ∑ k = 0 n a k ( i − j ) k ( i − j ) ! b_i = \sum_{j = 0}^na_j\sum_{k = 0}^i\frac{(-1)^k}{k!}\frac{(i - k)^j}{(i - k)!} = \sum_{j = 0}^i\frac{(-1)^j}{j!}\sum_{k = 0}^na_k\frac{(i - j)^k}{(i - j)!} bi=j=0najk=0ik!(1)k(ik)!(ik)j=j=0ij!(1)jk=0nak(ij)!(ij)k
显然为卷积式。注意到 k k k只在下标和指数位置上出现,设 g ( x ) = ∑ i = 0 n a i x i g(x) = \sum_{i = 0}^na_ix^i g(x)=i=0naixi,则可以通过多点求值算出 g ( 0 ) , g ( 1 ) , ⋯ g ( n ) g(0),g(1),\cdots g(n) g(0),g(1),g(n)的值,最后直接卷积计算 b b b即可。

#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
const int maxn = 1e5 + 50,maxm = 2.63e5,mod = 998244353,g = 3;
int n,N,a[maxn],rev[maxm],F[maxm],G[maxm],T[maxm],T1[maxm],T2[maxm],W[20][maxm],inv_W[20][maxm],inv[maxm];
vector <int> P[4 * maxn];
int read(){
   
	int x = 0;
	char c = getchar();
	while(c < '0' || c > '9') c = getchar();
	while(c >= '0' && c <= '9') x = x * 10 + (c ^ 48),c = getchar();
	return x;
}
inline int add(int x,int y){
   
	if(x + y < mod) return x + y;
	else return x + y - mod;
}
inline int dec(int x,int y){
   
	if(x - y >= 0) return x -
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值