ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P6800 【模板】Chirp Z-Transform

2022-07-14 16:01:22  阅读:131  来源: 互联网

标签:mc int LL Transform len Chirp ans binom P6800


\(\text{Solution}\)

考虑把\(c^i\)带入多项式得

\[ans_i = \sum_{j = 0}^{n - 1}a_jc^{ij} \]

利用组合数把\(c^{ij}\)拆开,\(ij = \binom{i + j}{2} - \binom{i}{2} - \binom{j}{2}\),证明把组合数拆开即可。

\[ans_i = \sum_{j = 0}^{n - 1}a_jc^{\binom{i + j}{2} - \binom{i}{2} - \binom{j}{2}} \]

\[ans_i = c^{-\binom{i}{2}}\sum_{j = 0}^{n - 1}a_jc^{-\binom{j}{2}}c^{\binom{i + j}{2}} \]

这时是一个卷积,只是有点不同,考虑设\(A_i = c^{\binom{i}{2}}\),\(B_{n - 1 - i} = a_ic^{-\binom{i}{2}}\)。枚举一个\(i+j\)加\(n - j\)即可。

\[ans_i = c^{-\binom{i}{2}}\sum_{(i + j) + (n - 1 - j) = i + n - 1}A_{i + j}B_{n - 1 - j} \]

\(\text{Code}\)

#include<cstdio>
#include<algorithm>
#define LL long long
using namespace std;
const int P = 998244353;
const int N = 1e6 + 5;
int n,m,rev[N * 5]; LL c,a[N],b[N],f[N * 5],g[N * 5];

LL fpow(LL x,LL y)
{
	LL res = 1;
	for (; x; x >>= 1,y = y * y % P)
		if (x & 1) res = res * y % P;
	return res;
}
void NTT(LL *f,int len,int fl)
{
	if (len == 1) return;
	for (int i = 0; i < len; i++)
		if (i < rev[i]) swap(f[i],f[rev[i]]);
	for (int l = 1; l < len; l <<= 1)
	{
		LL I = fpow((P - 1) / (l << 1),3);
		if (fl == -1) I = fpow(P - 2,I);
		for (int i = 0; i < len; i += (l << 1))
		{
			LL W = 1;
			for (int j = 0; j < l; j++,W = W * I % P)
			{
				LL x = f[i + j],y = W * f[i + j + l] % P;
				f[i + j] = (x + y) % P,f[i + j + l] = (x - y + P) % P;
			}
		} 
	}
}
int main()
{
	scanf("%d%lld%d",&n,&c,&m);
	for (int i = 0; i < n; i++) scanf("%lld",&a[i]);
	LL ic = fpow(P - 2,c),mc; 
	mc = ic,b[0] = b[1] = 1LL;
	for (int i = 2; i < (n > m ? n : m); i++) b[i] = b[i - 1] * mc % P,mc = mc * ic % P;
	mc = c,f[0] = f[1] = 1LL;
	for (int i = 2; i < n + m - 1; i++) f[i] = f[i - 1] * mc % P,mc = mc * c % P;
	for (int i = 0; i < n; i++) g[n - 1 - i] = a[i] * b[i] % P;
	
	int len = 1,bit = 0; 
	while (len <= 2 * n + m - 3) len <<= 1,bit++;
	for (int i = 1; i < len; i++) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << bit - 1);
	NTT(f,len,1),NTT(g,len,1);
	for (int i = 0; i < len; i++) f[i] = f[i] * g[i] % P;
	NTT(f,len,-1); LL inv = fpow(P - 2,len);
	for (int i = 0; i < m; i++)
		printf("%lld ",b[i] * f[n + i - 1] % P * inv % P);
}

标签:mc,int,LL,Transform,len,Chirp,ans,binom,P6800
来源: https://www.cnblogs.com/nibabadeboke/p/16478027.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有