【LUOGU???】WD与积木 NTT

题目大意

  把 \(n\) 个有标号物品分到一些有标号的箱子中且不允许为空,问期望箱子的数量。

  多组询问。

  \(n\leq 100000\)

题解

  记 \(f_i\)\(i\) 个有标号物品分到一些有标号的箱子中且不允许为空的箱子的数量之和。

  记 \(g_i\)\(i\) 个有标号物品分到一些有标号的箱子中且不允许为空的方案数。

  答案为 \(\frac{f_n}{g_n}\)

  转移就是枚举最后一个箱子放了多少物品:
\[ \begin{align} g_i&=\sum_{j=1}^ig_{i-j}\binom{i}{j}\\ f_i&=\sum_{j=1}^i(f_{i-j}+g_{i-j})\binom{i}{j}\\ \end{align} \]

  记 \(F(x)=\sum_{i\geq 0}f_i\frac{x^i}{i!},G(x)=\sum_{i\geq 0}g_i\frac{x^i}{i!}\),(即这两个数列的EGF)有:
\[ \begin{align} G(x)&=-G(x)+e^xG(x)+1\\ 2G(x)-e^xG(x)&=1\\ G(x)&=\frac{1}{2-e^x}\\ F(x)&=-F(x)-G(x)+e^x(F(x)+G(x))+1\\ (2-e^x)F(x)+(1-e^x)G(x)&=1\\ F(x)&=\frac{(e^x-1)G(x)}{2-e^x}\\ &=\frac{e^x-1}{(2-e^x)^2} \end{align} \]

  直接卷积+求逆即可。

  时间复杂度:\(O(n\log n)\)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<functional>
#include<cmath>
#include<vector>
#include<assert.h>
//using namespace std;
using std::min;
using std::max;
using std::swap;
using std::sort;
using std::reverse;
using std::random_shuffle;
using std::lower_bound;
using std::upper_bound;
using std::unique;
using std::vector;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef std::pair<int,int> pii;
typedef std::pair<ll,ll> pll;
void open(const char *s){
#ifndef ONLINE_JUDGEchar str[100];sprintf(str,"%s.in",s);freopen(str,"r",stdin);sprintf(str,"%s.out",s);freopen(str,"w",stdout);
#endif
}
void open2(const char *s){
#ifdef DEBUGchar str[100];sprintf(str,"%s.in",s);freopen(str,"r",stdin);sprintf(str,"%s.out",s);freopen(str,"w",stdout);
#endif
}
int rd(){int s=0,c,b=0;while(((c=getchar())<'0'||c>'9')&&c!='-');if(c=='-'){c=getchar();b=1;}do{s=s*10+c-'0';}while((c=getchar())>='0'&&c<='9');return b?-s:s;}
void put(int x){if(!x){putchar('0');return;}static int c[20];int t=0;while(x){c[++t]=x%10;x/=10;}while(t)putchar(c[t--]+'0');}
int upmin(int &a,int b){if(b<a){a=b;return 1;}return 0;}
int upmax(int &a,int b){if(b>a){a=b;return 1;}return 0;}
const ll p=998244353;
const int N=270000;
ll fp(ll a,ll b)
{ll s=1;for(;b;b>>=1,a=a*a%p)if(b&1)s=s*a%p;return s;
}
namespace ntt
{const int W=262144;int rev[N];int *w[20];void init(){ll s=fp(3,(p-1)/W);w[18]=new int[1<<17];w[18][0]=1;for(int i=1;i<W/2;i++)w[18][i]=w[18][i-1]*s%p;for(int i=17;i>=1;i--){w[i]=new int[1<<(i-1)];for(int j=0;j<1<<(i-1);j++)w[i][j]=w[i+1][j<<1];}}void ntt(ll *a,int n,int t){for(int i=1;i<n;i++){rev[i]=(rev[i>>1]>>1)|(i&1?n>>1:0);if(rev[i]>i)swap(a[i],a[rev[i]]);}for(int i=2,l=1;i<=n;i<<=1,l++)for(int j=0;j<n;j+=i)for(int k=0;k<i/2;k++){ll u=a[j+k];ll v=a[j+k+i/2]*w[l][k];a[j+k]=(u+v)%p;a[j+k+i/2]=(u-v)%p;}if(t==-1){reverse(a+1,a+n);ll inv=fp(n,p-2);for(int i=0;i<n;i++)a[i]=a[i]*inv%p;}}void add(ll *a,ll *b,ll *c,int n,int m,int l){static ll a1[N];int k=max(n,m);for(int i=0;i<=k;i++)a1[i]=0;for(int i=0;i<=n;i++)a1[i]=(a1[i]+a[i])%p;for(int i=0;i<=m;i++)a1[i]=(a1[i]+b[i])%p;for(int i=0;i<=l;i++)c[i]=a1[i];}void mul(ll *a,ll *b,ll *c,int n,int m,int l){static ll a1[N],a2[N];int k=1;while(k<=n+m)k<<=1;for(int i=0;i<k;i++)a1[i]=a2[i]=0;for(int i=0;i<=n;i++)a1[i]=a[i];for(int i=0;i<=m;i++)a2[i]=b[i];ntt(a1,k,1);ntt(a2,k,1);for(int i=0;i<k;i++)a1[i]=a1[i]*a2[i]%p;ntt(a1,k,-1);for(int i=0;i<=l;i++)c[i]=(a1[i]+p)%p;}void getinv(ll *a,ll *b,int n){if(n==1){b[0]=fp(a[0],p-2);return;}getinv(a,b,n>>1);static ll a1[N],a2[N];for(int i=0;i<n<<1;i++)a1[i]=a2[i]=0;for(int i=0;i<n;i++)a1[i]=a[i];for(int i=0;i<n>>1;i++)a2[i]=b[i];ntt(a1,n<<1,1);ntt(a2,n<<1,1);for(int i=0;i<n<<1;i++)a1[i]=a2[i]*(2-a1[i]*a2[i]%p)%p;ntt(a1,n<<1,-1);for(int i=0;i<n;i++)b[i]=(a1[i]+p)%p;}
}
int n=100000;
int k=131072;
ll inv[N],fac[N],ifac[N];
ll a[N],b[N],f[N],g[N],ans[N],c[N];
int main()
{open("d");ntt::init();inv[1]=fac[0]=fac[1]=ifac[0]=ifac[1]=1;for(int i=2;i<=n;i++){inv[i]=(-p/i*inv[p%i]%p+p)%p;fac[i]=fac[i-1]*i%p;ifac[i]=ifac[i-1]*inv[i]%p;}for(int i=1;i<=n;i++){a[i]=ifac[i];b[i]=-ifac[i];
//      a[i]=1;
//      b[i]=-1;}a[0]=0;b[0]=1;ntt::getinv(b,g,k);ntt::mul(g,g,c,n,n,n);ntt::mul(a,c,f,n,n,n);for(int i=1;i<=n;i++){f[i]=(f[i]*fac[i]%p+p)%p;g[i]=(g[i]*fac[i]%p+p)%p;}for(int i=1;i<=n;i++)ans[i]=(f[i]*fp(g[i],p-2)%p+p)%p;int t;scanf("%d",&t);int x;while(t--){scanf("%d",&x);printf("%lld\n",ans[x]);}return 0;
}

转载于:https://www.cnblogs.com/ywwyww/p/10200501.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7对讲机调频软件_对讲机怎么配对?

有好多朋友买到了新对讲机和老对讲机的频率不一样&#xff0c;从而导致了新旧对讲机无法通联。买到了新对讲机&#xff0c;我们要先知道旧对讲机的频率是多少。要想知道旧对讲机的频率是多少&#xff0c;我们就要需要一定的工具&#xff0c;首先我们要有一台XP系统的电脑&#…

RTK、IMU、RT3000

GPS/RTK 全球卫星定位系统(GPS)的全面建成和发展&#xff0c;导致了导航和测绘行业的一场重大深刻的技术革命。常规的静态GPS测量方法越来越多地应用于高精度控制网的建立&#xff0c;但利用该方法无法在野外对观测数据进行实时检核&#xff0c;从而造成观测结果不合格而需要返…

POJ--3974 Palindrome(回文串,hash)

链接&#xff1a;点击这里 #include<iostream> #include<algorithm> #include<stdio.h> #include<cstring> using namespace std; #define maxn 1000005 #define LL long long #define ull unsigned long long const LL P 131; ull p[maxn10],f[maxn]…

Springboot 两种方式配置启动热部署(图文界面)

目录 前言1. 类加载启动2. devtools前言 Java的热部署(Hot Deployment)是指在应用程序运行时更新或替换类文件,而无需重新启动整个应用程序。 代表不停止应用程序的情况下修改代码并立即看到变化,这对于开发和调试过程非常有用。 类加载器(Class Loader): Java应用程序…

Microsoft VBScript 编译器错误 错误原因 代码大全

Microsoft VBScript 编译器错误 错误 缺少语句ActiveServerPages,ASP0126(0x80004005)-->找不到包含文件 MicrosoftOLEDBProviderforODBCDrivers(0x80040E21)-->sql语句出错(数据类型不匹配或表名(字段名)错误或表处于编辑状态&#xff0c;或表不存在于conn打开的数据库…

hadoop3 禁用ec_Hadoop + Amazon EC2 –更新的教程

hadoop3 禁用ec在Hadoop的Wiki页面上放置了一个旧教程&#xff1a; http : //wiki.apache.org/hadoop/AmazonEC2 &#xff0c;但是最近我不得不遵循本教程&#xff0c;并且我注意到它没有涵盖某些Amazon新功能。 建议您已经熟悉Hadoop的基础来学习本教程&#xff0c;可以在Had…

libuv 原理_Libuv初理解

整体概念libuv是一个跨平台、专门写给nodejs的库&#xff0c;它的设计是围绕着事件驱动的异步I/O模型。在不同的I/O轮询机制上&#xff0c;libuv提供的不是简单抽象对象&#xff1a;handle和streams为sockets和其他实例提供了一个高级抽象。此外&#xff0c;libuv还提供了跨平台…

Matlab排序函数sort()和sortrows()

sort() 调用形式 1.Ysort(X) 对矩阵、向量或数组进行升序排列。 例1 >> amagic(4)a 16 2 3 135 11 10 89 7 6 124 14 15 1>> brand(1,4)b 0.8147 0.9058 0.1270 0.9134>> sort(a)ans 4 2 3…

[Swift]LeetCode968.监控二叉树 | Binary Tree Cameras

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号&#xff1a;山青咏芝&#xff08;shanqingyongzhi&#xff09;➤博客园地址&#xff1a;山青咏芝&#xff08;https://www.cnblogs.com/strengthen/&#xff09;➤GitHub地址&a…

Maven神秘化

由于我的Android开发的背景下&#xff0c;我比较习惯到摇篮 &#xff0c;而不是Maven的 。 尽管我知道Gradle基于Maven&#xff0c;但我从未调查过幕后发生的事情。 在过去的一周中&#xff0c;我一直在尝试了解细节并找出Maven的不同组成部分。 什么是Maven Maven是主要用于J…

走进JVM【二】理解JVM内存区域

引言 对于C程序员&#xff0c;内存分配与回收的处理一直是令人头疼的问题。Java由于自身的自动内存管理机制&#xff0c;使得管理内存变得非常轻松&#xff0c;不容易出现内存泄漏&#xff0c;溢出的问题。 不容易不代表不会出现问题&#xff0c;一旦内存泄漏或溢出的情况发生&…

mysql一对多_mysql一对多查询合并多的一方的数据。

有时候会有这样一个需求&#xff0c;查询的一条记录需要包含另一个表的多条记录&#xff0c;并且让多条记录成为一个字段组成最终的一条记录。比较难描述&#xff0c;看例子吧。创建一个产品表&#xff1a;create table product(proId int(10),proName varchar(50))创建一个成分…

Matlab矩阵、元胞数组的合并拼接

矩阵合并拼接 1.横向拼接 [a,b] [a b]均可 例1 >> amagic(3)a 8 1 63 5 74 9 2>> brand(3)b 0.6324 0.5469 0.15760.0975 0.9575 0.97060.2785 0.9649 0.9572>> c[a,b]c 8.0000 1.0000 6.0000 0.632…

Matlab拆分矩阵/Matlab如何分割大矩阵(mat2cell函数)

dim1Dist分割后矩阵行数组成的向量&#xff0c;dimNDist指的是分割后矩阵列数组成的向量 例有100*200的矩阵A >> Arand(100,200); >> bmat2cell(A,[30 40 30],[100 70 30])b 33 cell 数组{30100 double} {3070 double} {3030 double}{40100 double} {40…

分布式系统部署、监控与进程管理的几重境界

陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice t.sina.com.cn/giantchen 陈硕关于分布式系统的系列文章&#xff1a;http://blog.csdn.net/Solstice/category/802325.aspx 本作品采用“Creative Commons 署名-非商业性使用-禁止演绎 3.0 Unported 许可协议(cc by-nc-nd)”…

.net core mvc初级教程(六)

一、创建movie的视图 二、对cinema、movie视图添加‘添加信息’的操作 一、创建movie的视图 在views文件夹下添加Movie文件夹&#xff0c;在这个文件夹下添加Index.cshtml视图&#xff0c;为什么添加Index.cshtml这个名字的视图&#xff0c;可以看看我们写的MovieController控制…

apache camel_发掘Apache Camel的力量

apache camel最近几年&#xff0c;ESB软件越来越受欢迎。 如果大多数人通常知道什么是ESB&#xff0c;那么他们很少会清楚地了解这种体系结构的不同组件的确切作用。 例如&#xff0c;Apache ServiceMix由三个主要组件组成&#xff1a;Apache Karaf&#xff08;OSGI容器&#…

角反射器的功能及应用

雷达反射器又名角反射器&#xff0c;它是通过金属板材根椐不同用途做成的不同规格的雷达波反射器。当雷达电磁波扫描到角反射后&#xff0c;电磁波会在金属角上产生折射放大&#xff0c;产生很强的回波信号&#xff0c;在雷达的屏幕上出现很强的回波目标。由于角反射器有极强的…

mysql卸载权限不够_Linu下启动MySQL结果显示:env: /etc/init.d/mysql:权限不够怎么解决?...

展开全部Linu下启动MySQL结果显示&#xff1a;env: /etc/init.d/mysql: 是脚本执行的问题解决办法&#xff1a;依次e69da5e887aa3231313335323631343130323136353331333365633936执行下面的命令(执行失败的话&#xff0c;检查路径是否正确)&#xff1a;cp /etc/init.d/mysql /e…

GDAL/ORG之Python获取与安装

GDAL(Geospatial Data Abstraction Library)是一个的开源栅格空间数据读取/转换库。其中还有一系列命令行工具来进行数据转换和处理。而ORG项目是GDAL的一个分支&#xff0c;功能与GDAL类似&#xff0c;但其提供对矢量数据的支持。 也就是说&#xff0c;可以用ORG的库来读取、处…