题解

我们要对于每个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. getDimension与getDimensionPixelOffset与getDimensionPixelSize的区别

    getDimension()                       返回float型px值     精确  getDimensionPixelOffset()     返回int型px值     ...

  2. C++ 文件操作(简易的学籍管理系统)

    这是一个简易的学籍管理系统,大一时居然三个人写了一千多行......年少无知啊!欢迎摘果实! 1 #include <iostream> #include <fstream> ...

  3. macOS 安装 Java (Homebrew)

    macOS 安装多个 Java 版本 Homebrew 是 macOS 下的一个非常好用的包管理工具, caskroom 则是基于 Homebrew 构建的一个强大的应用程序管理器. Homebrew ...

  4. windows下scrapy安装问题,以及Twisted安装报错(error: Microsoft Visual C++ 14.0 is required.)完美解决办法

    方法1(通常是失败的) 1. 命令行执行: pip3 install scrapy 不管是网络问题也好,缺少相关的包也好,用这条命令安装scrapy我就没成功过...难受 方法2(成功) 手动安装相关 ...

  5. Linux 通过编译安装apache服务以及配置

    Linux 编译安装apache服务 一.安装 1.通过编译安装,首先需要下载源代码安装包 apache下载链接:http://httpd.apache.org/download.cgi 2.解开源代 ...

  6. 目录命令(RD)

    RD命令: // 描述: 删除目录或子目录.同 rmdir // 语法: rd [<drive:>]<path> /s /q /? // 参数: /s: (subdirecto ...

  7. 【Python 12】汇率兑换5.0(Lambda函数)

     1.案例描述 设计一个汇率换算程序,其功能是将美元换算成人民币,或者相反. 2.0增加功能:根据输入判断是人民币还是美元,进行相应的转换计算 3.0增加功能:程序可以一直运行,知道用户选择退出 4. ...

  8. C#基础知识之面向对象以及面向对象的三大特性

    在C#基础知识之类和结构体中我详细记录了类.类成员.重载.重写.继承等知识总结.这里就记录一下对面向对象和面向对象三大特性的广义理解. 一.理解面向对象 类是面向对象编程的基本单元,面向对象思想其实就 ...

  9. springboot aop + logback + 统一异常处理 打印日志

    1.src/resources路径下新建logback.xml 控制台彩色日志打印 info日志和异常日志分不同文件存储 每天自动生成日志 结合myibatis方便日志打印(debug模式) < ...

  10. day9-基础函数的学习(四)

    这几天一直赶着写写作业,博客的书写又落下了,要加油鸭,开写 今日份目录 1.内置函数 2.递归函数 开始今日份总结 1.内置函数 内置函数就是python内部包含的函数,总计有68种,不过有些事真的天 ...