题意

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

\(1 \leq n \leq 10^5\)

\(1\leq \sum m \leq 10^5\)

思路

设 \(\displaystyle S=-\sum_{i=1}^ma_i\)

\[g(x)=f(x+S)\\
g(x)=\sum_{i=0}^nc_i(x+S)^i\\
\]

二项展开后得到

\[g(x)=\sum_{i=0}^nc_i[\sum_{j=0}^i{i\choose j}S^{i-j}\cdot x^j]\\
\]

将 \(\displaystyle\sum_{j}\) 拉出,得到。

\[g(x)=\sum_{j=0}^n\sum_{i=j}^nc_i{i\choose j}S^{i-j}\cdot x^j\\
\]

那么多项式 \(g\) 的第 \(j\) 项 \(b_j\) 就是 \(\displaystyle\sum_{i=j}^nc_i{i\choose j}S^{i-j}\)

将组合数展开

\[b_j=\sum_{i=j}^nc_i S^{i-j}{i!\over j!(i-j)!}
\]

将只与 \(j\) 相关的项提出,合并变量相同的项得到

\[b_j={1\over j!}\sum_{i=j}^nc_ii!\cdot S^{i-j}{1\over (i-j)!}
\]

不难发现,右边有两项仅与 \(i\) 有关,有两项仅与 \(i-j\) 有关。

把式子写成卷积的形式

\[b_j={1\over j!}c_ii!\cdot S^{i-j}{1\over (i-j)!}
\]

用 \(i+j\) 替换 \(j\) 得到

\[b_{i+j}={1\over (i+j)!}c_ii!\cdot S^{-j}{1\over (-j)!}
\]

其中 \(i\in[0,n] ,j\in[-n,0],i+j\in[-n,n]\)

设 \(\displaystyle A_i=c_ii!,B_j=S^{-j}{1\over{(-j)!}}\)

那么就有了最终的表达式 \(\displaystyle b_{i+j}={1\over{i+j}}A_iB_j\)

对 \(A,B\) 两多项式进行卷积,最后乘上 \(\displaystyle {1\over {i+j}}\) 即可。

最后我们需要的只是 \(b\) 在 \([0,n]\) 的结果,多项式相乘一步,可以理解为:一组状态,每一个值都向一些方向转移一些值,用多项式表示就是一个状态多项式、一个转移多项式乘出一个结果多项式。关键是要保证所有状态的转移方向一致。

代码

  1. #include<bits/stdc++.h>
  2. #define FOR(i,x,y) for(int i=(x),i##END=(y);i<=i##END;++i)
  3. #define DOR(i,x,y) for(int i=(x),i##END=(y);i>=i##END;--i)
  4. typedef long long ll;
  5. using namespace std;
  6. const int P=998244353,g=3;
  7. const int N=1<<17|5;
  8. namespace Maths
  9. {
  10. ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
  11. void exgcd(ll a,ll b,ll &x,ll &y)
  12. {
  13. if(!b){x=1,y=0;return;}
  14. exgcd(b,a%b,y,x),y-=a/b*x;
  15. }
  16. ll Pow(ll a,ll p,ll P)
  17. {
  18. ll res=1;
  19. for(;p>0;p>>=1,(a*=a)%=P)if(p&1)(res*=a)%=P;
  20. return res;
  21. }
  22. ll inv(ll a,ll P){ll x,y;exgcd(a,P,x,y);return (x%P+P)%P;}
  23. };
  24. using namespace Maths;
  25. namespace _NTT
  26. {
  27. int A[N<<1],B[N<<1];
  28. int r[N<<1];
  29. void NTT(int *a,int p,int n)
  30. {
  31. FOR(i,0,n-1)if(i<r[i])swap(a[i],a[r[i]]);
  32. for(int i=2;i<=n;i<<=1)
  33. {
  34. int wn=Pow(g,(P-1)/i,P);
  35. if(p==-1)wn=inv(wn,P);
  36. for(int j=0;j<n;j+=i)
  37. {
  38. int w=1;
  39. for(int k=0;k<i/2;k++)
  40. {
  41. int u=a[j+k],t=(ll)w*a[j+k+i/2]%P;
  42. a[j+k]=(u+t)%P,a[j+k+i/2]=(u-t)%P;
  43. w=(ll)w*wn%P;
  44. }
  45. }
  46. }
  47. }
  48. void multiply(const int *a,const int *b,int *c,int n1,int n2)
  49. {
  50. int n=1;
  51. while(n<n1+n2-1)n<<=1;
  52. FOR(i,0,n1-1)A[i]=a[i];
  53. FOR(i,0,n2-1)B[i]=b[i];
  54. FOR(i,n1,n-1)A[i]=0;
  55. FOR(i,n2,n-1)B[i]=0;
  56. FOR(i,0,n-1)r[i]=(r[i>>1]>>1)|((i&1)*(n>>1));
  57. NTT(A,1,n),NTT(B,1,n);
  58. FOR(i,0,n-1)A[i]=(ll)A[i]*B[i]%P;
  59. NTT(A,-1,n);
  60. int I=inv(n,P);
  61. FOR(i,0,n1+n2-2)c[i]=(ll)A[i]*I%P;
  62. }
  63. };
  64. int A[N],B[N],C[N<<2];
  65. int fac[N],c[N],S;
  66. int n,m;
  67. int main()
  68. {
  69. fac[0]=1;FOR(i,1,N-1)fac[i]=(ll)fac[i-1]*i%P;
  70. while(~scanf("%d",&n))
  71. {
  72. FOR(i,0,n)scanf("%d",&c[i]);
  73. scanf("%d",&m);
  74. S=0;
  75. while(m--)
  76. {
  77. int x;
  78. scanf("%d",&x);
  79. S-=x;
  80. if(S<0)S+=P;
  81. }
  82. FOR(i,0,n)A[i]=(ll)c[i]*fac[i]%P;
  83. FOR(i,-n,0)B[i+n]=Pow(S,-i,P)*inv(fac[-i],P)%P;
  84. _NTT::multiply(A,B,C,n+1,n+1);
  85. FOR(i,0,n)printf("%lld ",(C[i+n]*inv(fac[i],P)%P+P)%P);
  86. puts("");
  87. }
  88. return 0;
  89. }

HDU 6061 RXD and functions(NTT)的更多相关文章

  1. 【推导】【NTT】hdu6061 RXD and functions(NTT)

    题意:给定一个n次多项式f(x)的各项系数,让你求f(x-Σai)的各项系数. http://blog.csdn.net/v5zsq/article/details/76780053 推导才是最关键的 ...

  2. 2017 Multi-University Training Contest - Team 3 RXD and functions(NTT)

    题解: 我是参考的 http://blog.csdn.net/qq_32570675/article/details/76571666 这一篇 orz 原来可以这么变换,涨姿势 代码: #includ ...

  3. 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 ...

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

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

  5. 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 ...

  6. hdu 1080 Human Gene Functions(DP)

    题意: 人类基因由A.C.G.T组成. 有一张5*5的基因表.每格有一个值,叫相似度.例:A-C:-3.意思是如果A和C配对, 则它俩的相似度是-3[P.S.:-和-没有相似度,即-和-不能配对] 现 ...

  7. HDU 5829 Rikka with Subset(NTT)

    题意 给定 \(n\) 个数 \(a_1,a_2,\cdots a_n\),对于每个 \(K\in[1,n]\) ,求出 \(n\) 个数的每个子集的前 \(K\) 大数的和,输出每个值,对 \(99 ...

  8. HDU 6061 RXD and functions

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

  9. HDU 6060 RXD and dividing(LCA)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6060 [题目大意] 给一个n个节点的树,要求将2-n号节点分成k部分, 然后将每一部分加上节点1, ...

随机推荐

  1. MQTT 发布者订阅者

    添加依赖: <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclip ...

  2. 使用yaml+groovy实现Java代码可配置化

    背景与目标 在使用函数接口和枚举实现配置式编程(Java与Scala实现),使用了函数接口和枚举实现了配置式编程.读者可先阅读此文,再来阅读本文. 有时,需要将一些业务逻辑,使用配置化的方式抽离出来, ...

  3. vue路由5:命名视图

    <div id="app"> <div> <router-link to="/">首页</router-link> ...

  4. Codeforce 814A - An abandoned sentiment from past (贪心)

    A few years ago, Hitagi encountered a giant crab, who stole the whole of her body weight. Ever since ...

  5. <转>jmeter(十一)JDBC Request之Query Type

    本博客转载自:http://www.cnblogs.com/imyalost/category/846346.html 个人感觉不错,对jmeter讲解非常详细,担心以后找不到了,所以转发出来,留着慢 ...

  6. C++ for循环与迭代器

    1.基本的for循环 std::vector<int> arr; ... for(std::vector<int>::iterator it=arr.begin();it!=a ...

  7. Linux 执行程序 报错误:Permission denied.

    是对此文件所在位置没有权限导致的 chmod +x /home/yourfile 即可

  8. The Little Prince-12/02

    The Little Prince-12/02 What moves me so deeply, about this little prince who is sleeping here, is h ...

  9. 【附】Python安装

    Python是跨平台的,它可以运行在Windows.Mac和各种Linux/Unix系统上. 首先要实现Python安装及环境变量配置,然后会得到Python解释器(就是负责运行Python程序的), ...

  10. kswapd0 进程CPU占用过高

    前几天遇到的一个问题,自己本地用VM配置的虚拟机,一般会top查看进程以及CPU占用的一些情况.又一次用laravel 打印对象,里面的内容比较多,浏览器当时就卡了. 然后看进程的情况.我以为会是ng ...