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 ...
随机推荐
- EditText超出字数限制,给用户提示
当我们在Editext输入内容的时候,检测如果超过限制的长度无法输入内容,并且给用户提示. 首先我想到了下面的方法: editText.addTextChangedListener(new TextW ...
- win10 系统 wifi自动断开连接 wifi热点不稳定
我的系统的电脑是win10系统,笔记本 下载了一个wifi共享大师,但是wifi总是自动断,于是就找了找问题所在 在网上看了许多方案,大多数都是 在 电源管理 把[允许计算机关闭此设备以节 ...
- VMware虚拟机系统无法使用桥接联网
1.环境 VMware 14.1.1 虚拟系统:Windows Server 2008 32位 2.解决办法 打开虚拟网络编辑器 有红框中的提示出现时,就点击更改设置 点击桥接模式,在VMnet信息中 ...
- Eclipse启动报错,解决办法
打开log日志,发现如下错误.原因是修改了计算机用户名导致 !SESSION Thu Aug 30 08:55:41 CST 2018 -------------------------------- ...
- webstorm 的 .后缀名-tab快捷键
if (key) {}//key.if tab if (!key) {}//key.else tab if (key != null) {}//key.notnull tab if (typeof k ...
- SQLServer之创建辅助XML索引
创建辅助XML索引 使用 CREATE INDEX (Transact-SQL)Transact-SQL DDL 语句可创建辅助 XML 索引并且可指定所需的辅助 XML 索引的类型. 创建辅助 XM ...
- LeetCode算法题-Subtree of Another Tree(Java实现)
这是悦乐书的第265次更新,第278篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第132题(顺位题号是572).给定两个非空的二进制树s和t,检查树t是否具有完全相同的 ...
- Linux VMware新添加网络适配器找不到配置文件问题
VMware centos 新添加网卡没有识别,在做 Linux 实验时经常遇到需要双网卡的情况,VMware 新添加网卡后Linux是不会主动创建 ifcfg-eth* 文件的,重启服务器和重启网络 ...
- Vue 自定义一个插件的用法、小案例及在项目中的应用
1.开发插件 install有两个参数,第一个是Vue构造器,第二个参数是一个可选的选项对象 MyPlugin.install = function (Vue, options) { // 1 ...
- CentOS 6.5 minimal 安装配置VMware tools
1.登录到系统,切换到root账户 2.配置网络 minimal版本默认不启动网络,所以要自己配置. 配置过程很简单,编辑配置文件 vi /etc/sysconfig/network-script/i ...