复函数,递归代入,可以得到最终的式子为$f(x-\sum_{i=1}^{m}{a_i})$,且$f(x) = \sum_{i = 0}^{n}{c_ix^i}$,求最终各个x项的系数。

设$S=\sum_{i=1}^{m}{a_i}$

先二项式展开

\begin{eqnarray*} f(x-S)&=&\sum_{i=0}^{n}{c_i{(x-S)}^i} \newline &=&\sum_{i=0}^{n}{ c^i\sum_{j=0}^{i}{ \binom{j}{i}x^{j}(-S)^{i-j} } }\end{eqnarray*}

交换求和符号

\begin{eqnarray*}&=&\sum_{j=0}^{n}{ x^{j} \sum_{i=0}^{n-j}{c_{i+j}\binom{j}{i+j}(-S)^{i}} } \newline &=&\sum_{j=0}^{n}{ x^{j} \sum_{i=0}^{n-j}{c_{i+j}\frac{(i+j)!}{{i!}{j!}}(-S)^{i}} }\newline &=&\sum_{j=0}^{n}{ \frac{x^{j}}{j!} \sum_{i=0}^{n-j}{c_{i+j}(i+j)! \frac{(-S)^{i}}{i!} } }\end{eqnarray*}

因为只要系数,也就是说对于每个j,得到对应的${j!}b_j$,求后一个求和符号里的值就行了

注意到卷积公式$\sum^{n}_{i=0}{f(i)h(n-i)}= f(n)*h(n)$,而且模数998244353是费马素数

故设$k = n - j, A[i] = \frac{(-S)^{i}}{i!},B[i]=c_{k-i-i}(k-i-j)! $,则$C[n - j] =\sum_{i=0}^{j}A[i]B[n-j-i]=\sum_{i=0}^{n-j} c_{i+j}(i+j)! \frac{(-S)^{i}}{i!} $

对A和B使用NTT加速卷积的计算,最后结果在A[i]上,记得反转为A[n-i]。推公式化卷积式,套模板。

#include <bits/stdc++.h>
#define LL long long
using namespace std; const LL N = 1e5 + 10;
const LL mod = 998244353;
const int g = 3;
const int maxlen = 1 << 18; LL wn[maxlen], fac[N], inv[N]; LL fpow(LL a, LL n)
{
LL ans = 1;
while(n)
{
if(n & 1)
ans = (ans * a % mod + mod) %mod;
a = (a * a + mod) % mod;
n >>= 1;
}
return ans;
} void init()
{
wn[0] = 1;
wn[1] = fpow(g, ((mod - 1)>>18));
for(int i = 2; i < maxlen; i++)
wn[i] = wn[i - 1] * wn[1] % mod;
fac[1] = inv[1] = 1;
fac[0] = inv[0] = 1;
for(int i = 2; i < N; i++)
{
fac[i] = fac[i - 1] * i % mod;
inv[i] = (mod - mod / i) * inv[mod % i] % mod;
}
for(int i = 1; i < N; i++)
(inv[i] *= inv[i - 1]) %= mod;
} void rader(LL f[], int len)
{
for(int i = 1, j = len >> 1; i < len - 1; i++)
{
if(i < j) swap(f[i], f[j]);
int k = len >> 1;
while(j >= k)
{
j -= k;
k >>= 1;
}
if(j < k) j += k;
}
}
void ntt(LL f[], int len, int on)
{
/*for(int i = 0, j = 0; i < len;i++)
{
if(i > j) swap(f[i], f[j]);
for(int l = len >> 1; (j^=l) < l; l>>=1);
}*/
rader(f, len);
for(int i = 1, d = 1; d < len; i++, d <<= 1)
{
//LL wnn = fpow(g, (mod-1)/(d<<1));
for(int j = 0; j < len; j += (d << 1))
{
//LL w = 1;
for(int k = 0; k < d; k++)
{
LL t = wn[(maxlen >> i) * k] * f[j + k + d] % mod;
//LL t = w*f[j+k+d]%mod;
//w = w*wnn % mod;
f[j + k + d] = ((f[j + k] - t) % mod + mod) % mod;
f[j + k] = ((f[j + k] + t) % mod + mod) % mod;
}
}
}
if(on == -1)
{
reverse(f + 1, f + len);
LL inv2 = fpow(len, mod - 2);
for(int i = 0; i < len; i++)
f[i] = f[i] % mod * inv2 % mod;
}
} void work(LL a[], LL b[], int len)
{
ntt(a, len, 1);
ntt(b, len, 1);
for(int i = 0; i < len; i++)
a[i] = (a[i] * b[i] % mod + mod) % mod;
ntt(a, len, -1);
} LL A[maxlen], B[maxlen], Suma, c[N];
int n, m;
int main()
{
init();
while(~scanf("%d", &n))
{
for(int i = 0; i <= n; i++) scanf("%lld", c + i);
scanf("%d", &m);
Suma = 0;
LL t;
for(int i = 0; i < m; i++)
scanf("%lld", &t), Suma -= t;
Suma = (Suma + mod) % mod;
while(Suma < 0)
Suma += mod;
if(Suma == 0)
{
for(int i = 0; i <= n; i++)
printf("%lld ", c[i]);
printf("\n");
continue;
}
//getLength
int len = 1;
while(len <= 2*n) len <<= 1;
//
LL ae = 1;
for(int i = 0; i < len; i++)
{
if(i <= n)
{
B[i] = ae * inv[i] % mod;
A[i] =(fac[n - i] * c[n - i]) % mod;
}
else A[i] = B[i] = 0;
ae = (ae * Suma) % mod;
//cout << A[i] << "~"<< B[i] << endl;
}
work(A, B, len);
for(int i = 0; i <= n; i++)
A[i] = A[i] * inv[n - i] % mod;
for(int i = 0; i <= n; i++)
printf("%lld ", A[n - i]);
printf("\n");
}
}

HDU 6061 推导 NTT的更多相关文章

  1. 2017 多校3 hdu 6061 RXD and functions

    2017 多校3 hdu 6061 RXD and functions(FFT) 题意: 给一个函数\(f(x)=\sum_{i=0}^{n}c_i \cdot x^{i}\) 求\(g(x) = f ...

  2. HDU 6061 - RXD and functions | 2017 Multi-University Training Contest 3

    每次NTT都忘记初始化,真的是写一个小时,Debug两个小时- - /* HDU 6061 - RXD and functions [ NTT ] | 2017 Multi-University Tr ...

  3. HDU 6061 RXD and functions(NTT)

    题意 给定一个\(n​\) 次的 \(f​\) 函数,向右移动 \(m​\) 次得到 \(g​\) 函数,第 \(i​\) 次移动长度是 \(a_i​\) ,求 \(g​\) 函数解析式的各项系数,对 ...

  4. HDU 6061 RXD and functions NTT

    RXD and functions Problem Description RXD has a polynomial function f(x), f(x)=∑ni=0cixiRXD has a tr ...

  5. HDU 6061 RXD and functions

    题目链接:HDU-6061 题意:给定f(x),求f(x-A)各项系数. 思路:推导公式有如下结论: 然后用NTT解决即可. 代码: #include <set> #include < ...

  6. HDU 5322 Hope ——NTT 分治 递推

    发现可以推出递推式.(并不会) 然后化简一下,稍有常识的人都能看出这是一个NTT+分治的情况. 然而还有更巧妙的方法,直接化简一下递推就可以了. 太过巧妙,此处不表,建议大家找到那篇博客. 自行抄写 ...

  7. HDU 5279 分治NTT 图的计数

    思路: 显然每个子图内都是森林 去掉所有子图1和n都连通且每条大边都存在的情况 直接DP上 NTT优化一波 注意前两项的值.. //By SiriusRen #include <bits/std ...

  8. HDU 5734 Acperience (推导)

    Acperience 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5734 Description Deep neural networks (DN ...

  9. HDU 2086 A1 = ? (找规律推导公式 + 水题)(Java版)

    Equations 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2086 ——每天在线,欢迎留言谈论. 题目大意: 有如下方程:Ai = (Ai-1 ...

随机推荐

  1. "Hello World"团队召开的第三周第七次会议

    今天是我们团队“Hello World!”团队召开的第三周的第七次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.Todo List 六.会议照片 七.燃尽图 一.会议时 ...

  2. 随机生成30道四则运算-NEW

    补充:紧跟上一个随机生成30道四则运算的题目,做了一点补充,可以有真分数之间的运算,于是需要在原来的基础上做一些改进. 首先指出上一个程序中的几个不足:1.每次执行的结果都一样,所以不能每天给孩子出3 ...

  3. c# Webservice技术整理

    因为平常项目中使用webservice比较少,然后就将本来不太熟悉的webservice给忘记掉了.所以再次整理如下: 百度搜索关键词 :c# webservice 1. 联接地址: http://w ...

  4. java 队列的使用(转载)

    转载声明:http://blog.csdn.net/lzy_lizhiyang/article/details/48311925 先我们要知道使用队列的目的是什么?一般情况下,如果是一些及时消息的处理 ...

  5. Nodejs学习笔记(一)--- 操作Mysql数据库

    对于一门语言的学习,我个人觉得最好的方式就是通过一个项目来展示,所以从基本的一些模块去了解是最好的方式对于Mysql怎么去链接数据库这个我是在网上找到的(其实一直想找官方文档的,发现没有它的踪迹,(后 ...

  6. Beta阶段冲刺第二天

    提供当天站立式会议照片一张 讨论项目每个成员的昨天进展 错题集功能编写没有彻底完成. 界面改善 测试数据库连接 讨论项目每个成员的存在问题 邹其元:错题集功能需要用到数据库,现在要解决的问题是怎样把数 ...

  7. flink写入mysql的两种方式

    方式一 通过JDBCOutputFormat 在flink中没有现成的用来写入MySQL的sink,但是flink提供了一个类,JDBCOutputFormat,通过这个类,如果你提供了jdbc的dr ...

  8. delphi完美经典--第十八章

    第18章数据感知组件 一.TDBText组件 用来以只读.一次一条记录的方式,显示DataSet中的某一字段值.因同样继承自TCustomLabel,TDBText组件除了数据感知功能外,与标准组件T ...

  9. Moya/RxSwift/ObjectMapper/Alamofire开发

    废话不多说直接上代码 // // MoyaNetWorking.swift // GreenAir // // Created by BruceAlbert on 2017/9/18. // Copy ...

  10. BZOJ3594 SCOI2014方伯伯的玉米田(动态规划+树状数组)

    可以发现每次都对后缀+1是不会劣的.考虑dp:设f[i][j]为前i个数一共+1了j次时包含第i个数的LIS长度.则f[i][j]=max(f[i][j-1],f[k][l]+1) (k<i,l ...