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 ...
随机推荐
- MongoDB在已有账号的实例下还原数据库报错的分析(error applying oplog)
一. 背景 今天在MongoDB 4.0.4版本下,在还原恢复数据库时报错. 主要错误为: Failed: restore error: error applying oplog: applyOps: ...
- python 爬取全本免费小说网的小说
这几天朋友说想看电子书,但是只能在网上看,不能下载到本地后看,问我有啥办法?我找了好几个小说网址看了下,你只能直接在网上看,要下载txt要冲钱买会员,而且还不能在浏览器上直接复制粘贴.之后我就想到py ...
- iOS开发之OC与swift开发混编教程,代理的相互调用,block的实现。OC调用Swift中的代理, OC调用Swift中的Block 闭包
本文章将从两个方向分别介绍 OC 与 swift 混编 1. 第一个方向从 swift工程 中引入 oc类 1. 1 如何在swift的类中使用oc类 1.2 如何在swift中实现oc的代理 ...
- nginx实现新老网站跳转(原URL不变)
新老网站实现跳转 原URL保持不变 通过手动添加cookie 匹配cookie的方法进行跳转第一步 进行添加if判断条件 if ( $query_string ~* "sr=pro" ...
- SQLServer之创建存储过程
创建存储过程注意事项 在 SQL Server. Azure SQL Database.Azure SQL 数据仓库和并行数据库中创建 Transact-SQL 或公共语言运行时 (CLR) 存储过程 ...
- LeetCode算法题-Average of Levels in Binary Tree(Java实现)
这是悦乐书的第277次更新,第293篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第145题(顺位题号是637).给定一个非空二叉树,以数组的形式返回每一层节点值之和的平 ...
- #018 C语言刷题 素数问题
今天做题学会了一个求素数的方法 总分 13 孪生素数 相差为2的两个素数称为孪生素数.例如,3与5,41与43等都是孪生素数.设计程序求出指定区间上的所有孪生素数对.区间上限和下限由键盘获取. 程序运 ...
- BJOI2019做题笔记
奥术神杖(分数规划.AC自动机) 发现我们要求的东西很像一个平均数(实际上就是几何平均数),那么我们现在考虑一种运算,使得乘法能够变成加法.开根可以变成除法,不难想到取对数满足这个条件.我们对\(\s ...
- 玩转3D Swiper美女性感秀之思路分析总结
前言 继一次的3D魔方之后,这次利用CSS3的transform.translate.rotate.preserve-3d等结合JS的requestAnimationFrame.class带你一起玩转 ...
- OCR技术浅析-无代码篇(1)
图像识别中最贴近我们生活的可能就是 OCR 技术了. OCR 的定义:OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打 ...