题面在这里

description

对于\(k=1,2,...,t\),求$$\frac{1}{nm}\sum_{i=1}{n}\sum_{j=1}{m}(a_i+b_j)^k$$

对\(998244353\)取模。

data range

\[1\le n,m,k\le 10^5,0\le a_i,b_i\le 998244352
\]

solution

由于要求多项式

\[\begin{aligned}
Ans(x)&=\sum_{k=1}^{t}\sum_{i=1}^{n}\sum_{j=1}^{m}(a_i+b_j)^kx^k\\
&=\sum_{k=1}^{t}\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{s=1}^{k}\binom{k}{s}a_i^sb_j^{k-s}x^k\\
&=\sum_{k=1}^{t}k!\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{s=1}^{k}\frac{a_i^s}{s!}\frac{b_j^{k-s}}{(k-s)!}x^k\\
&=\sum_{k=1}^{t}k!\sum_{s=1}^{k}(\sum_{i=1}^{n}\frac{a_i^s}{s!})(\sum_{j=1}^{m}\frac{b_j^{k-s}}{(k-s)!})x^k\\
&=\sum_{k=1}^{t}k!\sum_{s=1}^{k}\frac{\sum_{i=1}^{n}a_i^s}{s!}\frac{\sum_{j=1}^{m}b_j^{k-s}}{(k-s)!}x^k\\
\end{aligned}\]

我们记

\[f_k(x)=\sum_{s=1}^{k}\frac{\sum_{i=1}^{n}a_i^s}{s!}\frac{\sum_{j=1}^{m}b_j^{k-s}}{(k-s)!}x^s
\]

则$$Ans(x)=\sum_{k=1}{t}f_k(1)xk$$

即其系数的前缀和

于是现在我们要求出$$g_a(x)=\sum_{i=1}{t}\sum_{j=1}{n}a_jixi$$

构造函数\(h(x)=\prod_{i=1}^{n}(a_ix+1)\),因为

\[ln[h(x)]=\sum_{i=1}^{n}ln(a_ix+1)
\]

\[ln'(a_ix+1)=\frac{a_i}{a_ix+1}=\sum_{j=1}^{\infty}(-1)^ja_i^{j+1}x^j
\]

对上面这个式子求积分,我们有

\[ln(a_ix+1)=\sum_{j=1}^{\infty}(-1)^{j-1}\frac{a_i^j}{j}x^j
\]

于是我们有

\[\begin{aligned}
ln[h(x)]&=\sum_{i=1}^{n}\sum_{j=1}^{\infty}(-1)^{j-1}\frac{a_i^j}{j}x^j\\
&=\sum_{j=1}^{\infty}(-1)^{j-1}\frac{\sum_{i=1}^{n}a_i^j}{j}x^j\\
\end{aligned}\]

\(h(x)\)我们可以使用分治\(FFT\)在\(O(nlog^2n)\)的时间内求出;

\(ln[h(x)]\)可以使用多项式求\(ln\)在\(O(nlogn)\)的时间内求出,

系数稍加处理即可得到\(g_a(x)\)和\(g_b(x)\);

最后将\(g_a(x)\)和\(g_b(x)\)做一遍\(NTT\)即可得到\(f(x)\)。

总时间复杂度为\(O(nlog^2n)\)

常数巨大

调试\(3+day\)后终于过了第二个样例

code

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. #include<cmath>
  5. #include<cstring>
  6. #define RG register
  7. #define il inline
  8. using namespace std;
  9. typedef long long ll;
  10. typedef double dd;
  11. const int N=400010;
  12. const int mod=998244353;
  13. const dd pi=acos(-1);
  14. il int read(){
  15. RG int d=0,w=0;char ch=getchar();
  16. while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
  17. if(ch=='-')w=1,ch=getchar();
  18. while(ch>='0'&&ch<='9')d=(d<<3)+(d<<1)+(ch^48),ch=getchar();
  19. return w?-d:d;
  20. }
  21. il int poww(int a,int b){
  22. RG int ret=1;
  23. for(;b;b>>=1,a=1ll*a*a%mod)
  24. if(b&1)ret=1ll*ret*a%mod;
  25. return ret;
  26. }
  27. int r[N];
  28. il void NTT(int *a,int n,int opt){
  29. for(RG int i=0;i<n;i++)if(i<r[i])swap(a[i],a[r[i]]);
  30. for(RG int i=2;i<=n;i<<=1){
  31. RG int wn=poww((opt==1)?3:((mod+1)/3),(mod-1)/i);
  32. for(RG int j=0;j<n;j+=i){
  33. RG int w=1;
  34. for(RG int k=j;k<j+(i>>1);k++,w=1ll*w*wn%mod){
  35. RG int x=1ll*a[k+(i>>1)]*w%mod;
  36. a[k+(i>>1)]=(a[k]-x+mod)%mod;
  37. a[k]=(a[k]+x)%mod;
  38. }
  39. }
  40. }
  41. if(opt==-1)
  42. for(RG int i=0,rev=poww(n,mod-2);i<n;i++)
  43. a[i]=1ll*a[i]*rev%mod;
  44. }
  45. int inv[N];
  46. il void initinv(int n){
  47. inv[0]=inv[1]=1;
  48. for(RG int i=2;i<n;i++)inv[i]=1ll*inv[mod%i]*(mod-mod/i)%mod;
  49. }
  50. int x[N],y[N];
  51. #define M ((L+R)>>1)
  52. void solve(int *a,int L,int R){//分治FFT
  53. if(L==R)return;solve(a,L,M);solve(a,M+1,R);
  54. RG int n=M-L+1,m=R-M,len=1,l=0;
  55. for(;len<=(n+m);len<<=1,l++);
  56. for(RG int i=0;i<len;i++)r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
  57. for(RG int i=0;i<len;i++)x[i]=y[i]=0;x[0]=y[0]=1;
  58. for(RG int i=1;i<=n;i++)x[i]=a[L+i-1];
  59. for(RG int i=1;i<=m;i++)y[i]=a[M+i];
  60. NTT(x,len,1);NTT(y,len,1);
  61. for(RG int i=0;i<len;i++)x[i]=1ll*x[i]*y[i]%mod;
  62. NTT(x,len,-1);
  63. for(RG int i=1;i<=n+m;i++)a[L+i-1]=x[i];
  64. }
  65. il void getdao(int *a,int *x,int n){//多项式求导
  66. for(RG int i=0;i<n;i++)x[i]=1ll*a[i+1]*(i+1)%mod;x[n-1]=0;
  67. }
  68. il void getjifen(int *a,int *x,int n){//多项式求积分
  69. for(RG int i=n-1;i;i--)x[i]=1ll*a[i-1]*inv[i]%mod;x[0]=0;
  70. }
  71. int xi[N],yi[N];
  72. void getinv(int *f,int *g,int n,int l){//多项式求逆
  73. if(n==1){g[0]=poww(f[0],mod-2);return;}getinv(f,g,n>>1,l-1);
  74. for(RG int i=0;i<(n<<1);i++)r[i]=(r[i>>1]>>1)|((i&1)<<l);
  75. for(RG int i=0;i<(n<<1);i++)xi[i]=yi[i]=0;
  76. for(RG int i=0;i<n;i++)xi[i]=f[i];
  77. for(RG int i=0;i<(n>>1);i++)yi[i]=g[i];
  78. NTT(xi,n<<1,1);NTT(yi,n<<1,1);
  79. for(RG int i=0;i<(n<<1);i++)
  80. xi[i]=1ll*(2-1ll*xi[i]*yi[i]%mod+mod)%mod*yi[i]%mod;
  81. NTT(xi,n<<1,-1);
  82. for(RG int i=0;i<n;i++)g[i]=xi[i];
  83. }
  84. void getln(int *a,int *f,int n,int l){//多项式求ln
  85. memset(x,0,sizeof(x));memset(y,0,sizeof(y));
  86. getdao(a,x,n);getinv(a,y,n,l);
  87. for(RG int i=0;i<(n<<1);i++)r[i]=(r[i>>1]>>1)|((i&1)<<l);
  88. NTT(x,n<<1,1);NTT(y,n<<1,1);
  89. for(RG int i=0;i<(n<<1);i++)x[i]=1ll*x[i]*y[i]%mod;
  90. NTT(x,n<<1,-1);
  91. getjifen(x,f,n);
  92. }
  93. int n,m,t,a[N],b[N],f[N],g[N],l,rv;
  94. int main()
  95. {
  96. n=read();m=read();rv=1ll*poww(n,mod-2)*poww(m,mod-2)%mod;
  97. for(RG int i=1;i<=n;i++)a[i]=read();
  98. for(RG int i=1;i<=m;i++)b[i]=read();
  99. solve(a,1,n);solve(b,1,m);//分治FFT得到h(x);
  100. t=read();a[0]=b[0]=1;
  101. for(l=0;(1<<l)<=t;l++);initinv(1<<l);
  102. getln(a,f,(1<<l),l);getln(b,g,(1<<l),l);
  103. for(RG int i=1;i<=t;i++){
  104. f[i]=(i&1)?(1ll*f[i]*i%mod):((mod-1ll*f[i]*i%mod)%mod);
  105. g[i]=(i&1)?(1ll*g[i]*i%mod):((mod-1ll*g[i]*i%mod)%mod);
  106. }
  107. //多项式求ln得到ga(x)和gb(x);
  108. for(RG int i=1;i<=t;i++){
  109. inv[i]=1ll*inv[i-1]*inv[i]%mod;
  110. f[i]=1ll*f[i]*inv[i]%mod;
  111. g[i]=1ll*g[i]*inv[i]%mod;
  112. }
  113. f[0]=n;g[0]=m;m=n=t;
  114. for(m+=n,n=1,l=0;n<=m;l++,n<<=1);
  115. for(RG int i=0;i<n;i++)r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
  116. NTT(f,n,1);NTT(g,n,1);
  117. for(RG int i=0;i<n;i++)f[i]=1ll*f[i]*g[i]%mod;
  118. NTT(f,n,-1);
  119. for(RG int i=1,fac=1;i<=t;i++,fac=1ll*fac*i%mod){
  120. f[i]=1ll*f[i]*fac%mod;
  121. printf("%lld\n",1ll*f[i]*rv%mod);
  122. }
  123. return 0;
  124. }

[LouguT30212]玩游戏的更多相关文章

  1. 原生JS实战:写了个一边玩游戏,一边记JS的API的游戏

    本文是苏福的原创文章,转载请注明出处:苏福CNblog:http://www.cnblogs.com/susufufu/p/5878913.html 本程序[一边玩游戏,一边记JS的API]是本人的个 ...

  2. bzoj4730: Alice和Bob又在玩游戏

    Description Alice和Bob在玩游戏.有n个节点,m条边(0<=m<=n-1),构成若干棵有根树,每棵树的根节点是该连通块内编号最 小的点.Alice和Bob轮流操作,每回合 ...

  3. 小易邀请你玩一个数字游戏,小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和

    小易邀请你玩一个数字游戏,小易给你一系列的整数.你们俩使用这些整数玩游戏.每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字. 例如: 如果{2,1,2 ...

  4. cdoj 1136 邱老师玩游戏 树形背包

    邱老师玩游戏 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1136 Desc ...

  5. win7系统玩游戏不能全屏的解决办法

    1.修改注册表中的显示器的参数设置   Win键+R键,打开运行窗口,输入regedit回车,这样就打开了注册表编辑器,然后,定位到以下位置:   HKEY_LOCAL_MACHINE\SYSTEM\ ...

  6. 【用PS3手柄在安卓设备上玩游戏系列】连接手柄和设备

    背景 硬件要求1:PS3 手柄 + 手柄配套的USB线 硬件要求2:已经获得 ROOT 权限并且支持蓝牙的安卓设备 软件要求1:Sixaxis Compatibility Checker PS3 手柄 ...

  7. UESTC_邱老师玩游戏 2015 UESTC Training for Dynamic Programming<Problem G>

    G - 邱老师玩游戏 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  8. 【特殊的图+DP】【11月校赛】大家一起玩游戏

    大家一起玩游戏 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submi ...

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

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

随机推荐

  1. eclipse导入jmeter3.1源码并运行

    jmeter3.1源码地址:https://archive.apache.org/dist/jmeter/source/ 1.打开eclipse,新建一个java project的项目,并点击next ...

  2. Apache POI:Excel读写库

    1)Apache POI 简介 Apache POI是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写 ...

  3. Python对文本文件逐行扫描,将含有关键字的行存放到另一文件

    #逐行统计关键字行数,并将关键字所在行存放在新的文件中 keyword = "INFO" b = open("C:\\Users\\xxx\\Documents\\new ...

  4. django 连接mysql报错

    原因: 问题1. 即从mysql5.7版本之后,默认采用了caching_sha2_password验证方式. 问题2.  然后在执行 python manage.py makemigrations依 ...

  5. 卸载CDH5.7

    CDH5.7卸载1.记录用户数据目录2.关闭所有服务2.1在CM中,选择某个集群,然后停止集群.2.2逐个关闭CDH中的服务3.删除parcels4.删除集群5.卸载Cloudera manager ...

  6. 软件工程第二周PSP

  7. c# 生成的没用文件

    1.pdb 2.vhost 3.application 4.含有更新功能(更新文件夹)

  8. Huffuman树

    问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下: 1. ...

  9. android入门 — AlertDialog对话框

    常见的对话框主要分为消息提示对话框.确认对话框.列表对话框.单选对话框.多选对话框和自定义对话框. 对话框可以阻碍当前的UI线程,常用于退出确认等方面. 在这里主要的步骤可以总结为: 1.创建Aler ...

  10. LintCode-379.将数组重新排序以构造最小值

    将数组重新排序以构造最小值 给定一个整数数组,请将其重新排序,以构造最小值. 注意事项 The result may be very large, so you need to return a st ...