题目

在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)(模板题)相关推荐

  1. 牛客练习赛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_ ...

  2. 牛客练习赛50 F tokitsukaze and Another Protoss and Zerg(分治NTT)

    一些废话: 写完上一题(分治FFT)之后记起之前牛客写的这道题,题解是用启发式NTT,每次选两个项数最小的合并,当时没有整理NTT的模板所以就先mark了,今天受到分治FFT的启发,想用分治NTT来解 ...

  3. 解题报告(一)C、(牛客练习赛41 F)简单数学题(数论 + FWT)(3.5)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  4. 牛客练习赛50(牛客1080F):F.tokitsukaze and Another Protoss and Zerg(组合数学 + NTT + 启发式)

    题目链接:https://ac.nowcoder.com/acm/contest/1080/F 题目描述 还记得校赛的"Protoss and Zerg"吗?(https://ac ...

  5. 牛客练习赛33 D tokitsukaze and Inverse Number (树状数组求逆序对,结论)

    链接:https://ac.nowcoder.com/acm/contest/308/D 来源:牛客网 tokitsukaze and Inverse Number 时间限制:C/C++ 1秒,其他语 ...

  6. 牛客练习赛29: F. 算式子

    链接:https://www.nowcoder.com/acm/contest/211/F 来源:牛客网 题目描述 给定  个整数  .保证  . 对于每个  ,求出 .为了避免过量输出,你只需要将所 ...

  7. 牛客练习赛 43 F Tachibana Kanade Loves Game 容斥原理(Java版ac)

    链接:https://ac.nowcoder.com/acm/contest/548/F 来源:牛客网 题目描述 立华奏是一个天天打比赛的萌新. 省选将至,萌新立华奏深知自己没有希望进入省队,因此开始 ...

  8. 牛客练习赛63 F 牛牛的树行棋 (SG函数+树差分)

    链接:https://ac.nowcoder.com/acm/contest/5531/F 来源:牛客网 牛牛的树行棋 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K, ...

  9. 【牛客网】牛客练习赛19 F 算式子【数学--递推 、前缀、数字】

    传送门:算式子 花了一些时间理解AC的代码,震惊,代码真的是短小精悍,推理能力很强亦或者是做题多,见的多. 能够理解里面的逻辑真的挺难的 题意 给定n,m,\(1\le x\le m\),求\(\su ...

最新文章

  1. C语言数据类型:联合(union)
  2. Spring事务--笔记
  3. python分离文件名和路径_python 分离文件名和路径以及分离文件名和后缀的方法...
  4. python中until函数_等待应用程序窗口:python中的pywinauto.timings.WaitUntilPasses
  5. Qt ModbusTCP ModbusRTU 使用同步读和异步写
  6. 总结一下切换git地址 重合代码的过程
  7. AudioScheduledSourceNode
  8. 踩了无数个坑,才写出稿费1000的文章
  9. fpga一个按键控制跑马灯启停_车上这些开关都认识吗?一次带你认清车上按键...
  10. 电脑麦克风使用不了没有声音了怎么办
  11. OAuth2.0学习(1-11)新浪开放平台微博认证-使用OAuth2.0调用微博的开放API
  12. DHCP保留地址与超级作用域centos7
  13. qt 部署 错误_QT for Windows安装配置总结及采坑问题汇总
  14. 地级市面板数据(2000-2019)四:失业+进出口+工资+规上企业+房地产等(stata版)
  15. 【概率论】范畴分布 Categorical / Multinoulli Distribution
  16. 数学建模学习笔记---Mooc1
  17. 目标检测之将bbox绘制到图片上
  18. Codeforces Round #767 (Div. 2)题解
  19. 电影主题HTM5网页设计作业成品——爱影评在线电影(10页面)使用dreamweaver制作采web前端设计与开发期末作品 用DIV CSS进行布局
  20. 为什么事务普遍加在service层

热门文章

  1. Node.js npm 使用介绍
  2. 基于模型的新能源汽车整车热管理系统设计方案
  3. 服务器安全文件,文件服务器安全防护系统-虹安 - 数据防泄密,文档加密,源代码防泄密,数据防泄漏,DLP数据防泄密整体解决方案提供商...
  4. Java必知必会的问题
  5. python: 实现一个简单的日记程序
  6. 更新TKK失败,请检查网络连接的解决办法
  7. 群控成为微商月入百万的神器
  8. WPS新建文字分享微信.docx形式_高效神器:花 5 分钟输入文字,就能自动变成 PPT...
  9. 哔哩哔哩自动播放视频
  10. 计算机中的科学思维能力指哪三种,浅析计算机应用与科学思维能力培养