牛客练习赛50 F.tokitsukaze and Another Protoss and Zerg(分治+NTT)(模板题)
题目
在n场1v1中,假设第i场,有ai个星灵单位,和bi个虫族单位。
tokitsukaze可以在一场1v1中,任选一种种族进行游戏。
如果选择了星灵,那么在这场游戏中,可以选择出兵1到ai个单位。
那么同理,如果选择了虫族,那么在这场游戏中,可以选择出兵1到bi个单位。
tokitsukaze想知道,恰好选择了0,1,2,3,...,个星灵单位的方案数分别是多少。
由于答案很大,所以输出答案mod 998244353 后的结果。
假设所有星灵单位互不相同,所有异虫单位也互不相同。
注意:若两个方案,有其中一个单位不同,即视为不相同。
n<=1e5,ai<=2e5,bi<=1e5,。
题解
考虑生成函数为,
c0即选b[i]的非空子集,方案数
其余ck(1<=k<=ai)即从a[i]中选k个,方案数
放入系数之后,直接分治+NTT即可,
开始试了一发分治+FFT炸了精度
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1<<18,mod=998244353,G=3;int n,sum;
int a[N],b[N],fac[N],finv[N];ll A[N],B[N],inv;
int R[N];
int power(int x,int n)
{int res=1;for(;n;n>>=1,x=1ll*x*x%mod)if(n&1)res=1ll*res*x%mod;return res;
}
vector <int> colors[N<<1];
struct cmp{bool operator ()(int a,int b){return colors[a].size()>colors[b].size();}
};
priority_queue <int,vector<int>,cmp> heap;
void NTT(ll a[],int n,int re){for (int i=0;i<n;i++)if (i<R[i])swap(a[i],a[R[i]]);for(int i=2;i<=n;i<<=1){ll mid=i>>1;ll wn=power(G,(mod-1)/i);if(re) wn=power(wn,(mod-2));for(int j=0;j<n;j+=i){ll w=1;for(int k=0;k<mid;k++){ll temp1=a[j+k];ll temp2=a[j+k+mid]*w%mod;a[j+k]=(temp1+temp2)%mod;a[j+k+mid]=(temp1-temp2);a[j+k+mid]=(a[j+k+mid]%mod+mod)%mod;w=w*wn%mod;}}}if(re){for(int i=0;i<n;i++)a[i]=(a[i]*inv)%mod;}
}
void NTT_times(vector <int> &a,vector <int> &b,vector <int> &c){int n,d;for (int i=0;i<a.size();i++)A[i]=a[i];for (int i=0;i<b.size();i++)B[i]=b[i];for (n=1,d=0;n<a.size()+b.size()-1;n<<=1,d++);inv=power(n,mod-2);for (int i=0;i<n;i++){R[i]=(R[i>>1]>>1)|((i&1)<<(d-1));}for (int i=a.size();i<n;i++)A[i]=0;for (int i=b.size();i<n;i++)B[i]=0;NTT(A,n,0),NTT(B,n,0);for (int i=0;i<n;i++)A[i]=A[i]*B[i]%mod;NTT(A,n,1);c.clear();for (int i=0;i<=a.size()+b.size()-2;i++)c.push_back(A[i]%mod);
}
void init()
{fac[0]=finv[0]=1;for(int i=1;i<N;++i)fac[i]=1ll*fac[i-1]*i%mod;finv[N-1]=power(fac[N-1],mod-2);for(int i=N-2;i>=1;--i)finv[i]=1ll*finv[i+1]*(i+1)%mod;
}
int C(int n,int m)
{if(m<0||n<m)return 0;return 1ll*fac[n]*finv[m]%mod*finv[n-m]%mod;
}
int main(){init();scanf("%d",&n);for(int i=1;i<=n;++i){scanf("%d",&a[i]);sum+=a[i];}for(int i=1;i<=n;++i)scanf("%d",&b[i]);while (!heap.empty())heap.pop();int sz=0;for (int i=1;i<=n;i++){colors[++sz].clear();colors[sz].push_back(power(2,b[i])-1);//选b[i]的一个非空子集 for(int j=1;j<=a[i];++j)colors[sz].push_back(C(a[i],j));//a[i]里面选j个heap.push(sz);}while (heap.size()>=2){int x=heap.top();heap.pop();int y=heap.top();heap.pop();NTT_times(colors[x],colors[y],colors[++sz]);colors[x].clear(),colors[y].clear();heap.push(sz);}for(int i=0;i<=sum;++i)printf("%d%c",colors[sz][i],i==sum?'\n':' ');return 0;
}
牛客练习赛50 F.tokitsukaze and Another Protoss and Zerg(分治+NTT)(模板题)相关推荐
- 牛客练习赛50 F tokitsukaze and Another Protoss and Zerg
tokitsukaze and Another Protoss and Zerg 考虑生成函数,每一场的生成函数为∑j=1b[i]Cb[i]j+∑j=1a[i]Ca[i]jxj\sum\limits_ ...
- 牛客练习赛50 F tokitsukaze and Another Protoss and Zerg(分治NTT)
一些废话: 写完上一题(分治FFT)之后记起之前牛客写的这道题,题解是用启发式NTT,每次选两个项数最小的合并,当时没有整理NTT的模板所以就先mark了,今天受到分治FFT的启发,想用分治NTT来解 ...
- 解题报告(一)C、(牛客练习赛41 F)简单数学题(数论 + FWT)(3.5)
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- 牛客练习赛50(牛客1080F):F.tokitsukaze and Another Protoss and Zerg(组合数学 + NTT + 启发式)
题目链接:https://ac.nowcoder.com/acm/contest/1080/F 题目描述 还记得校赛的"Protoss and Zerg"吗?(https://ac ...
- 牛客练习赛33 D tokitsukaze and Inverse Number (树状数组求逆序对,结论)
链接:https://ac.nowcoder.com/acm/contest/308/D 来源:牛客网 tokitsukaze and Inverse Number 时间限制:C/C++ 1秒,其他语 ...
- 牛客练习赛29: F. 算式子
链接:https://www.nowcoder.com/acm/contest/211/F 来源:牛客网 题目描述 给定 个整数 .保证 . 对于每个 ,求出 .为了避免过量输出,你只需要将所 ...
- 牛客练习赛 43 F Tachibana Kanade Loves Game 容斥原理(Java版ac)
链接:https://ac.nowcoder.com/acm/contest/548/F 来源:牛客网 题目描述 立华奏是一个天天打比赛的萌新. 省选将至,萌新立华奏深知自己没有希望进入省队,因此开始 ...
- 牛客练习赛63 F 牛牛的树行棋 (SG函数+树差分)
链接:https://ac.nowcoder.com/acm/contest/5531/F 来源:牛客网 牛牛的树行棋 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K, ...
- 【牛客网】牛客练习赛19 F 算式子【数学--递推 、前缀、数字】
传送门:算式子 花了一些时间理解AC的代码,震惊,代码真的是短小精悍,推理能力很强亦或者是做题多,见的多. 能够理解里面的逻辑真的挺难的 题意 给定n,m,\(1\le x\le m\),求\(\su ...
最新文章
- C语言数据类型:联合(union)
- Spring事务--笔记
- python分离文件名和路径_python 分离文件名和路径以及分离文件名和后缀的方法...
- python中until函数_等待应用程序窗口:python中的pywinauto.timings.WaitUntilPasses
- Qt ModbusTCP ModbusRTU 使用同步读和异步写
- 总结一下切换git地址 重合代码的过程
- AudioScheduledSourceNode
- 踩了无数个坑,才写出稿费1000的文章
- fpga一个按键控制跑马灯启停_车上这些开关都认识吗?一次带你认清车上按键...
- 电脑麦克风使用不了没有声音了怎么办
- OAuth2.0学习(1-11)新浪开放平台微博认证-使用OAuth2.0调用微博的开放API
- DHCP保留地址与超级作用域centos7
- qt 部署 错误_QT for Windows安装配置总结及采坑问题汇总
- 地级市面板数据(2000-2019)四:失业+进出口+工资+规上企业+房地产等(stata版)
- 【概率论】范畴分布 Categorical / Multinoulli Distribution
- 数学建模学习笔记---Mooc1
- 目标检测之将bbox绘制到图片上
- Codeforces Round #767 (Div. 2)题解
- 电影主题HTM5网页设计作业成品——爱影评在线电影(10页面)使用dreamweaver制作采web前端设计与开发期末作品 用DIV CSS进行布局
- 为什么事务普遍加在service层
热门文章
- Node.js npm 使用介绍
- 基于模型的新能源汽车整车热管理系统设计方案
- 服务器安全文件,文件服务器安全防护系统-虹安 - 数据防泄密,文档加密,源代码防泄密,数据防泄漏,DLP数据防泄密整体解决方案提供商...
- Java必知必会的问题
- python: 实现一个简单的日记程序
- 更新TKK失败,请检查网络连接的解决办法
- 群控成为微商月入百万的神器
- WPS新建文字分享微信.docx形式_高效神器:花 5 分钟输入文字,就能自动变成 PPT...
- 哔哩哔哩自动播放视频
- 计算机中的科学思维能力指哪三种,浅析计算机应用与科学思维能力培养