题解

我们要对于每个t,求一个(1/mn)sigma(ax+by)^t

把系数不用管,把其他部分二项式展开一下:

simga(ax^r*by^(t-r)*C(t,r))

把组合数拆开,就变成了一个卷积的形式。

t!*sigma((ax^r/r!)*(by^(t-r)/(t-r!))

不用管前面的系数,那么我们的卷积数组就是

sigma(ax^i)/i!

所以这道题本质让我们快速求f(i)=sigma(ax^i)

考虑生成函数

我们的f就是所有的这些生成函数的和。

然后上面的式子求和后变成

我们要求的就是所有这些东西的和。

考虑到

我么设G(x)为生面的式子,那么F(x)=-x*G(x)+n

所以我们只需要求出G(x)就好了。

下面的那个连乘可以用分治乘法算出来,然后求个ln就好了。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#define N 550002
using namespace std;
typedef long long ll;
const ll mod=;
const ll G=;
const ll Gi=;
ll a[N],c[N],b[N],d[N],mem[][N],cnt,jie[N],ni[N],bu[N],t,bb[N],mp[N];
int rev[N],n,m;
inline int rd(){
int x=;char c=getchar();bool f=;
while(!isdigit(c)){if(c=='-')f=;c=getchar();}
while(isdigit(c)){x=(x<<)+(x<<)+(c^);c=getchar();}
return f?-x:x;
}
inline ll power(ll x,ll y){
ll ans=;
while(y){if(y&)ans=ans*x%mod;x=x*x%mod;y>>=;}
return ans;
}
inline void NTT(ll *a,int l,int tag){
for(int i=;i<l;++i)if(i>rev[i])swap(a[i],a[rev[i]]);
for(int i=;i<l;i<<=){
ll wn=power(tag==?G:Gi,(mod-)/(i<<));
for(int j=;j<l;j+=(i<<)){
ll w=;
for(int k=;k<i;++k,w=w*wn%mod){
ll x=a[j+k],y=a[i+j+k]*w%mod;
a[j+k]=(x+y)%mod;a[i+j+k]=(x-y+mod)%mod;
}
}
}
}
void solve(ll *a,int l,int r,ll *ans){
if(l==r){ans[]=;ans[]=mod-a[l];return;}
int mid=(l+r)>>;ll *a1=mem[++cnt];ll *a2=mem[++cnt];
solve(a,l,mid,a1);solve(a,mid+,r,a2);
int len=,L=;
while(len<=*(r-l+))len<<=,L++;
for(int i=;i<len;++i)rev[i]=(rev[i>>]>>)|((i&)<<(L-));
NTT(a1,len,);NTT(a2,len,);
for(int i=;i<len;++i)ans[i]=a1[i]*a2[i]%mod;
NTT(ans,len,-);ll ny=power(len,mod-);
for(int i=;i<len;++i)ans[i]=ans[i]*ny%mod,a1[i]=,a2[i]=;
cnt-=;
}
void get_inv(ll *a,ll *b,int len){
if(len==){b[]=power(a[],mod-);return;}
get_inv(a,b,(len+)>>);
int l=,L=;
while(l<=(len<<))l<<=,L++;
for(int i=;i<l;++i)rev[i]=(rev[i>>]>>)|((i&)<<(L-));
for(int i=;i<len;++i)bu[i]=a[i];for(int i=len;i<l;++i)bu[i]=;
NTT(bu,l,);NTT(b,l,);
for(int i=;i<l;++i)b[i]=b[i]*(2ll-bu[i]*b[i]%mod+mod)%mod;
NTT(b,l,-);ll ny=power(l,mod-);
for(int i=;i<len;++i)b[i]=b[i]*ny%mod;for(int i=len;i<l;++i)b[i]=;
}
inline void get_dao(ll *a,int len){
for(int i=;i<len;++i)a[i-]=a[i]*i%mod;a[len-]=;
}
inline void flag(ll *a,int len,ll *ans){
int l=,L=;while(l<(max(len,(int)t)*))l<<=,L++;
solve(a,,len,ans);
get_inv(ans,b,t);get_dao(ans,l);//!!!!!!!!!!!!!
for(int i=;i<l;++i)rev[i]=(rev[i>>]>>)|((i&)<<(L-));
NTT(ans,l,);NTT(b,l,);
for(int i=;i<l;++i)ans[i]=ans[i]*b[i]%mod;
NTT(ans,l,-);ll ny=power(l,mod-);
for(int i=;i<l;++i)ans[i]=ans[i]*ny%mod;
for(int i=l-;i>=;--i)ans[i]=ans[i-]*(mod-)%mod;
ans[]=len;
for(int i=;i<=t;++i)ans[i]=ans[i]*ni[i]%mod;
for(int i=t+;i<l;++i)ans[i]=;
}
int main(){
n=rd();m=rd();
for(int i=;i<=n;++i)a[i]=rd();
for(int i=;i<=m;++i)bb[i]=rd();
t=rd();
jie[]=;for(int i=;i<=t;++i)jie[i]=jie[i-]*i%mod;ni[t]=power(jie[t],mod-);
for(int i=t-;i>=;--i)ni[i]=ni[i+]*(i+)%mod;
flag(a,n,c);memset(b,,sizeof(b));flag(bb,m,d);
int l=,L=;
while(l<=t*)l<<=,L++;
for(int i=;i<l;++i)rev[i]=(rev[i>>]>>)|((i&)<<(L-));
NTT(c,l,);NTT(d,l,);
for(int i=;i<l;++i)c[i]=c[i]*d[i]%mod;
NTT(c,l,-);ll ny=power(l,mod-);
for(int i=;i<l;++i)c[i]=c[i]*ny%mod;
ny=power(1ll*n*m%mod,mod-);
for(int i=;i<=t;++i)printf("%lld\n",c[i]*jie[i]%mod*ny%mod);
return ;
}

luogu4705玩游戏的更多相关文章

  1. [Luogu4705] 玩游戏

    Description 给定两个长度分别为 \(n\) 和 \(m\) 的序列 \(a\) 和 \(b\).要从这两个序列中分别随机一个数,设为 \(a_x,b_y\),定义该次游戏的 \(k\) 次 ...

  2. Luogu4705 玩游戏 分治FFT

    传送门 \(\begin{align*} Ans_k &= \sum\limits_{i=1}^n\sum\limits_{j=1}^m (a_i + b_j)^k \\ &= \su ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Android为TV端助力 集成第三方播放器,实现全屏播放

    下面这Demo链接:Android实现全屏播放,各种格式支持直播,点播,不收费!

  2. json-gson:.isJsonNull()问题-堆栈溢出

    不用管我下面的第一个答案.我读得太快了. 看起来这是一个简单的例子,文件撒谎-或者至少是被误解了.幸运的是,代码并不是那么简单,而且gson是一个开源项目. 这是 JsonObject.get(Str ...

  3. Several ports (8005, 8080, 8009) required by Tomcat v9.0 Server at localhost

    Several ports (8005, 8080, 8009) required by Tomcat v9.0 Server at localhost 问题:Tomcat服务器的端口被占用 解决: ...

  4. c/c++ 网络编程 文件传输

    网络编程 文件传输 1,文件发送端 2,文件接收端 文件发送端: #include <iostream> #include <string.h> #include <sy ...

  5. 从Excel中导入数据时,提示“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”的解决办法

    注意,64位系统,用64位的补丁文件; https://www.cnblogs.com/A2008A/articles/2438962.html 操作系统:使用的是64位的Windows Server ...

  6. 一、Windows Server 2016 AD服务器搭建

    简介: AD是Active Directory的简写,中文称活动目录.活动目录(Active Directory)主要提供以下功能: 1)服务器及客户端计算机管理 2)用户服务 3)资源管理 4)桌面 ...

  7. Windows使用MongoDB,以及索引创建

    安装MongoDB https://www.mongodb.com/download-center#community 点击msi安装程序进行安装,可以进行自定义安装,选择安装位置,我选择的是D盘 在 ...

  8. 爬虫实例系列一(requests)

    一 爬虫简介 ''' 爬虫:通过编写程序,模拟浏览器上网,让其去互联网上爬取数据的过程 分类: 通用爬虫:爬取全部的页面数据 聚焦爬虫:抓取页面中局部数据 增量式爬虫:爬取网站中更新出的数据 反爬机制 ...

  9. flink如何动态支持依赖jar包提交

    通常我们在编写一个flink的作业的时候,肯定会有依赖的jar包.flink官方希望你将所有的依赖和业务逻辑打成一个fat jar,这样方便提交,因为flink认为你应该对自己的业务逻辑做好单元测试, ...

  10. pc端移动端拖拽实现

    #div1 { width: 100px; height: 100px; background: red; position: absolute; } html <div id="di ...