题面

传送门

题解

妈呀这辣鸡题目调了我整整三天……最后发现竟然是因为分治\(NTT\)之后的多项式长度不是\(2\)的幂导致把多项式的值存下来的时候发生了一些玄学错误……玄学到了我\(WA\)的点全都是\(WA\)在\(2\)的幂次行里……

看到这种题目二话不说先推倒

\[\begin{aligned}
[x^k]Ans
&={1\over nm}\sum_{i=1}^n\sum_{j=1}^m\left(a_i+b_j\right)^k\\
&={1\over nm}\sum_{i=1}^n\sum_{j=1}^m\sum_{p=0}^k{k\choose p}{a_i}^p{b_j}^{k-p}\\
&={k!\over nm}\sum_{p=0}^k{\sum_{i=1}^n{a_i}^p\over p!}{\sum_{j=1}^m{b_j}^{k-p}\over (k-p)!}\\
\end{aligned}
\]

然后这就被画成了一个卷积的形式

定义两个多项式\(A(x)=\sum_{i=0}^\infty x^i\sum_{j=1}^n{a_j}^i\),和\(B(x)=\sum_{i=0}^\infty x^i\sum_{j=1}^m{b_j}^i\),只要我们能求出这两个多项式的系数,然后一通乱搞之后就能求出\(Ans\)了

然后继续推倒

\[\begin{aligned}
A(x)
&=\sum_{i=0}^\infty x^i\sum_{j=1}^n{a_j}^i\\
&=\sum_{j=1}^n\sum_{i=0}^\infty {a_j}^ix^i\\
&=\sum_{i=1}^n{1\over 1-a_ix}\\
&=\sum_{i=1}^n {a_i}^0+{a_i}^1x^1+{a_i}^2x^2+...
\end{aligned}
\]

所以……这玩意儿该咋算啊……

我们设

\[\begin{aligned}
G(x)
&=\sum_{i=1}^n{-a_i\over 1-a_ix}\\
&=\sum_{i=1}^n-{a_i}^1-{a_i}^2x-{a_i}^3x^2-...\\
\end{aligned}
\]

那么就有\(A(x)=-xG(x)+n\)

然而我还是不会算\(G\)啊……

那就继续推倒

\[\begin{aligned}
G(x)
&=\sum_{i=1}^n{-a_i\over 1-a_ix}\\
&=\sum_{i=1}^n\ln'\left(1-a_ix\right)\\
&=\ln'\left(\prod_{i=1}^n (1-a_ix)\right)
\end{aligned}
\]

分治\(NTT\)就行啦

然后没有然后了

我错了多项式比计算几何难调多了

  1. //minamoto
  2. #include<bits/stdc++.h>
  3. #define R register
  4. #define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
  5. #define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
  6. #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
  7. using namespace std;
  8. char buf[1<<21],*p1=buf,*p2=buf;
  9. inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
  10. int read(){
  11. R int res,f=1;R char ch;
  12. while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
  13. for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
  14. return res*f;
  15. }
  16. char sr[1<<21],z[20];int C=-1,Z=0;
  17. inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
  18. void print(R int x){
  19. if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;
  20. while(z[++Z]=x%10+48,x/=10);
  21. while(sr[++C]=z[Z],--Z);sr[++C]='\n';
  22. }
  23. const int N=(1<<18)+5,P=998244353,Gi=332748118;
  24. inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
  25. inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
  26. inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
  27. int ksm(R int x,R int y){
  28. R int res=1;
  29. for(;y;y>>=1,x=mul(x,x))if(y&1)res=mul(res,x);
  30. return res;
  31. }
  32. vector<int>r[21];int rt[2][N<<1],inv[N],fac[N],ifac[N],lim,d;
  33. inline void init(R int len){lim=1,d=0;while(lim<len)lim<<=1,++d;}
  34. void Pre(){
  35. fp(d,1,18){
  36. r[d].resize(1<<d);
  37. fp(i,1,(1<<d)-1)r[d][i]=(r[d][i>>1]>>1)|((i&1)<<(d-1));
  38. }
  39. inv[0]=inv[1]=fac[0]=fac[1]=ifac[0]=ifac[1]=1;
  40. fp(i,2,262144){
  41. fac[i]=mul(fac[i-1],i),
  42. inv[i]=mul(P-P/i,inv[P%i]),
  43. ifac[i]=mul(ifac[i-1],inv[i]);
  44. }
  45. for(R int t=(P-1)>>1,i=1,x,y;i<=262144;i<<=1,t>>=1){
  46. x=ksm(3,t),y=ksm(Gi,t);
  47. rt[1][i]=rt[0][i]=1;
  48. fp(k,1,i-1){
  49. rt[1][k+i]=mul(rt[1][k+i-1],x),
  50. rt[0][k+i]=mul(rt[0][k+i-1],y);
  51. }
  52. }
  53. }
  54. int rev[N];
  55. void NTT(int *A,int ty){
  56. fp(i,0,lim-1)if(i<r[d][i])swap(A[i],A[r[d][i]]);
  57. for(R int mid=1;mid<lim;mid<<=1)
  58. for(R int j=0;j<lim;j+=(mid<<1))
  59. for(R int k=0,t;k<mid;++k)
  60. A[j+k+mid]=dec(A[j+k],t=mul(rt[ty][mid+k],A[j+k+mid])),
  61. A[j+k]=add(A[j+k],t);
  62. if(!ty)for(R int i=0,inv=ksm(lim,P-2);i<lim;++i)A[i]=mul(A[i],inv);
  63. }
  64. void Inv(int *a,int *b,int len){
  65. if(len==1)return b[0]=ksm(a[0],P-2),void();
  66. Inv(a,b,len>>1),init(len<<1);
  67. static int A[N],B[N];
  68. fp(i,0,len-1)A[i]=a[i],B[i]=b[i];
  69. fp(i,len,lim-1)A[i]=B[i]=0;
  70. NTT(A,1),NTT(B,1);
  71. fp(i,0,lim-1)A[i]=mul(A[i],mul(B[i],B[i]));
  72. NTT(A,0);
  73. fp(i,0,len-1)b[i]=dec(add(b[i],b[i]),A[i]);
  74. fp(i,len,lim-1)b[i]=0;
  75. }
  76. void Ln(int *a,int *b,int len){
  77. static int A[N],B[N];
  78. fp(i,1,len-1)A[i-1]=mul(a[i],i);A[len-1]=0;
  79. Inv(a,B,len),init(len<<1);fp(i,len,lim-1)A[i]=B[i]=0;
  80. NTT(A,1),NTT(B,1);
  81. fp(i,0,lim-1)A[i]=mul(A[i],B[i]);
  82. NTT(A,0);
  83. fp(i,1,len-1)b[i]=mul(A[i-1],inv[i]);b[0]=0;
  84. fp(i,len,lim-1)b[i]=0;
  85. }
  86. int D[25][N];
  87. void solve(int *a,int d,int l,int r){
  88. if(l==r)return D[d][0]=1,D[d][1]=P-a[l],void();
  89. int mid=(l+r)>>1;
  90. solve(a,d,l,mid),solve(a,d+1,mid+1,r),init(r-l+1+1);
  91. static int A[N],B[N];
  92. fp(i,0,mid-l+1)A[i]=D[d][i];fp(i,mid-l+2,lim-1)A[i]=0;
  93. fp(i,0,r-mid)B[i]=D[d+1][i];fp(i,r-mid+1,lim-1)B[i]=0;
  94. NTT(A,1),NTT(B,1);
  95. fp(i,0,lim-1)A[i]=mul(A[i],B[i]);
  96. NTT(A,0);
  97. fp(i,0,r-l+1)D[d][i]=A[i];
  98. fp(i,r-l+2,lim-1)D[d][i]=0;
  99. }
  100. int a[N],b[N],ak[N],bk[N];
  101. int n,m,t;
  102. void calc(int *a,int *b,int n,int t){
  103. static int A[N],B[N];
  104. solve(a,1,1,n);
  105. init(t+1);int len=lim;
  106. fp(i,0,n)A[i]=D[1][i];
  107. fp(i,n+1,len-1)A[i]=0;
  108. Ln(A,B,len);
  109. fp(i,1,len-1)B[i-1]=mul(B[i],i);B[len-1]=0;
  110. b[0]=n;
  111. fp(i,1,t)b[i]=mul(P-B[i-1],ifac[i]);
  112. }
  113. void Mul(int *a,int *b){
  114. init(t<<1);
  115. NTT(a,1),NTT(b,1);
  116. fp(i,0,lim-1)a[i]=mul(a[i],b[i]);
  117. NTT(a,0);
  118. int invm=ksm(mul(n,m),P-2);
  119. fp(i,1,t)print(1ll*a[i]*fac[i]%P*invm%P);
  120. }
  121. int main(){
  122. // freopen("testdata.in","r",stdin);
  123. Pre();
  124. n=read(),m=read();
  125. fp(i,1,n)a[i]=read();
  126. fp(i,1,m)b[i]=read();
  127. t=read();
  128. calc(a,ak,n,t),calc(b,bk,m,t);
  129. Mul(ak,bk);
  130. return Ot(),0;
  131. }

洛谷P4705 玩游戏(生成函数+多项式运算)的更多相关文章

  1. 洛谷P4705 玩游戏 [生成函数,NTT]

    传送门 这是两个月之前写的题,但没写博客.现在回过头来看一下发现又不会了-- 还是要写博客加深记忆. 思路 显然期望可以算出总数再乘上\((nm)^{-1}\). 那么有 \[ \begin{alig ...

  2. 洛谷 P4705 玩游戏 解题报告

    P4705 玩游戏 题意:给长为\(n\)的\(\{a_i\}\)和长为\(m\)的\(\{b_i\}\),设 \[ f(x)=\sum_{k\ge 0}\sum_{i=1}^n\sum_{j=1}^ ...

  3. [洛谷P4705]玩游戏

    题目大意:对于每个$k\in[1,t]$,求:$$\dfrac{\sum\limits_{i=1}^n\sum\limits_{j=1}^m(a_i+b_j)^k}{nm}$$$n,m,t\leqsl ...

  4. 洛谷 P4705 玩游戏

    题目分析 题目要求的是: \[ \sum_{i=1}^n\sum_{j=1}^m(a_i+b_j)^x(x\in [1,T]) \] 利用二项式定理化式子, \[ \begin{aligned} &a ...

  5. FFT/NTT总结+洛谷P3803 【模板】多项式乘法(FFT)(FFT/NTT)

    前言 众所周知,这两个东西都是用来算多项式乘法的. 对于这种常人思维难以理解的东西,就少些理解,多背板子吧! 因此只总结一下思路和代码,什么概念和推式子就靠巨佬们吧 推荐自为风月马前卒巨佬的概念和定理 ...

  6. 洛谷 P2197 nim游戏

    洛谷 P2197 nim游戏 题目描述 甲,乙两个人玩Nim取石子游戏. nim游戏的规则是这样的:地上有n堆石子(每堆石子数量小于10000),每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取 ...

  7. 洛谷 P1965 转圈游戏

    洛谷 P1965 转圈游戏 传送门 思路 每一轮第 0 号位置上的小伙伴顺时针走到第 m 号位置,第 1 号位置小伙伴走到第 m+1 号位置,--,依此类推,第n − m号位置上的小伙伴走到第 0 号 ...

  8. Luogu P4705 玩游戏

    题目描述 Alice 和 Bob 又在玩游戏. 对于一次游戏,首先 Alice 获得一个长度为 ​ 的序列 ​,Bob 获得一个长度为 ​ 的序列 bb.之后他们各从自己的序列里随机取出一个数,分别设 ...

  9. 【流水调度问题】【邻项交换对比】【Johnson法则】洛谷P1080国王游戏/P1248加工生产调度/P2123皇后游戏/P1541爬山

    前提说明,因为我比较菜,关于理论性的证明大部分是搬来其他大佬的,相应地方有注明. 我自己写的部分换颜色来便于区分. 邻项交换对比是求一定条件下的最优排序的思想(个人理解).这部分最近做了一些题,就一起 ...

随机推荐

  1. iOS倒计时

    现在开发基本上都有发送验证码,倒计时,下面说一种 #import <UIKit/UIKit.h> @interface UIButton (CountDown) -(void)startT ...

  2. Anaconda3 ubuntu18.04

    luo@luo-All-Series:~/MyFile/Anaconda3$ luo@luo-All-Series:~/MyFile/Anaconda3$ luo@luo-All-Series:~/M ...

  3. 275. H-Index II 递增排序后的论文引用量

    [抄题]: Given an array of citations in ascending order (each citation is a non-negative integer) of a ...

  4. 最长的相同节点值路径 · Longest Univalue Path

    [抄题]: Given a binary tree, find the length of the longest path where each node in the path has the s ...

  5. maven filter插件只替换了部分变量问题

    maven filter简介 maven的resources插件,有一个filter的作用,能够在打包的时候,从特定文件里读取key-value对,替换配置文件中的占位符变量.很多线上线下有不同环境的 ...

  6. Red Hat 6.5 Samba服务器的搭建(登录访问)

    搭建Samba服务器是为了实现Linux共享目录之后,在Windows可以直接访问该共享目录. 现在介绍如何在红帽6.5系统中搭建Samba服务. 搭建Samba服务之前,yum源必须配置好,本地源和 ...

  7. 前台的json数组转化为List<T>集合

    using System;using System.Collections.Generic;using System.Linq;using System.Runtime.Serialization;u ...

  8. [GO]runtime包及gosched的使用

    Gosched:让出CPU时间片 Goexit:退出当前的协程 GOMAXPROCS:设置使用最大的CPU数量(哇,牛逼了...) package main import ( "fmt&qu ...

  9. RPM管理,计划任务与性能监控

    =========== RPM 软件包管理: 相关命令: rpm -ivh 软件包名称 rpm -e 软件包名称     rpm -U 软件名称 软件包信息查询: 相关命令: rpm -q 查询指定软 ...

  10. 使用django rest framework写POST和GET接口

    https://www.cnblogs.com/Jack-cx/p/9351633.html