luogu4705玩游戏
题解
我们要对于每个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玩游戏的更多相关文章
- [Luogu4705] 玩游戏
Description 给定两个长度分别为 \(n\) 和 \(m\) 的序列 \(a\) 和 \(b\).要从这两个序列中分别随机一个数,设为 \(a_x,b_y\),定义该次游戏的 \(k\) 次 ...
- Luogu4705 玩游戏 分治FFT
传送门 \(\begin{align*} Ans_k &= \sum\limits_{i=1}^n\sum\limits_{j=1}^m (a_i + b_j)^k \\ &= \su ...
- 原生JS实战:写了个一边玩游戏,一边记JS的API的游戏
本文是苏福的原创文章,转载请注明出处:苏福CNblog:http://www.cnblogs.com/susufufu/p/5878913.html 本程序[一边玩游戏,一边记JS的API]是本人的个 ...
- bzoj4730: Alice和Bob又在玩游戏
Description Alice和Bob在玩游戏.有n个节点,m条边(0<=m<=n-1),构成若干棵有根树,每棵树的根节点是该连通块内编号最 小的点.Alice和Bob轮流操作,每回合 ...
- 小易邀请你玩一个数字游戏,小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和
小易邀请你玩一个数字游戏,小易给你一系列的整数.你们俩使用这些整数玩游戏.每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字. 例如: 如果{2,1,2 ...
- cdoj 1136 邱老师玩游戏 树形背包
邱老师玩游戏 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1136 Desc ...
- win7系统玩游戏不能全屏的解决办法
1.修改注册表中的显示器的参数设置 Win键+R键,打开运行窗口,输入regedit回车,这样就打开了注册表编辑器,然后,定位到以下位置: HKEY_LOCAL_MACHINE\SYSTEM\ ...
- 【用PS3手柄在安卓设备上玩游戏系列】连接手柄和设备
背景 硬件要求1:PS3 手柄 + 手柄配套的USB线 硬件要求2:已经获得 ROOT 权限并且支持蓝牙的安卓设备 软件要求1:Sixaxis Compatibility Checker PS3 手柄 ...
- UESTC_邱老师玩游戏 2015 UESTC Training for Dynamic Programming<Problem G>
G - 邱老师玩游戏 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
随机推荐
- OpenUDID 和 IDFA 比较
iOS标识符 现今来比较下,不同情况下两种标识符的变化情况.以下试验,每种标识符均分为存于Keychain和未存于Keychain的两种情况做比较. 广告标识符(IDFA-identifierForI ...
- WPF:DropShadowEffect 生效
1.BorderThickness = “XX”,xx可以当作阴影四周的宽度 2.BorderBrush="Transparent"
- adb server is out of date. killing完美解决
原本是想跑monkey测试的,可使用adb命令时提示:adb server is out of date. killing... 出现这个问题的原因是:adb使用的端口5037被占用了.下面我们说下如 ...
- matlab练习程序(水波特效)
还记得原来写过一个对图像进行波纹扭曲操作的博文. 这次实现的是水波特效,其实就是通过正余弦函数表示波纹中心位置慢慢向外扩散,通过叠加衰减因子使振幅不断减小,进而产生水波的效果. 效果如下: 原图: 波 ...
- 关于Python, ftplib模块中的cwd()进入含中文目录失败的问题
使用Python的ftplib模块连接ftp服务器时, 使用cwd()连接含中文的目录, 报错 : UnicodeEncodeError: 'latin-1' codec can't encode c ...
- Spring MVC 数据绑定 (四)
完整的项目案例: springmvc.zip 目录 实例 项目结构路径: 一.配置web.xml <?xml version="1.0" encoding="UTF ...
- 使用VBScript 脚本 开机播放声音
前言:环境Window 10 第一步写一个 VBScript 脚本 新建一个文本文档,将下面的代码复制到文本文档中,Ctrl+S保存 将文本文档的.txt 后缀 改为.vbs即可 最后,双击这个 vb ...
- Linux内核同步机制之(五):Read Write spin lock【转】
一.为何会有rw spin lock? 在有了强大的spin lock之后,为何还会有rw spin lock呢?无他,仅仅是为了增加内核的并发,从而增加性能而已.spin lock严格的限制只有一个 ...
- Golang 学习权威网站
Golang 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易. Golang 是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发 ...
- python3 str(字符串)
__add__函数 (在后面追加字符串) s1 ='Hello' s2 = s1.__add__(' boy!') print(s2) #输出:Hello boy! __contains__(判断是否 ...