2月杂题
1.P3920 [WC2014]紫荆花之恋
离线怎么做?考虑把点分树建出来。
在线怎么做?考虑定期重构,暴力查散点,跳点分树查整点。
2.CF1063F String Journey
:观察到答案不超过 ,暴力即可。
:考虑 表示 这个串的答案,则 。
倒着 dp ,每次判断 是否 ,只需要做 次判断。
相当于要找到一个 使得 。
注意到 单调不增。lcp 利用 SAM 处理,则变成 fail 树上的单点修改,子树 max ,线段树维护即可。
3.P4649 [IOI2007] training 训练路径
注意到没有偶环,相当于每个非树边覆盖的路径,长度是奇数,且两两不交。
如果一个路径 覆盖了一条边,就给这个边染上颜色 。
表示处理了子树 , 到 染色为 ,最大的权值。我们对于每个路径,在 lca 处算贡献。
转移是一个状压 dp 的过程,复杂度 。
4.LOJ2765「JOI 2013 Final」 冒泡排序
观察到交换的 一定满足 ,且 是 中严格最大值, 是 中严格最小值。
对于 ,对答案有 的贡献。把可能的 和 拎出来,并以点 表示交换 的答案,那么 贡献的范围一定是一个矩阵。
注意 可能有相同的,有一些特殊情况,处理是类似的。
由此扫描线即可。复杂度 。
5.P6846 [CEOI2019] Amusement Park
首先,一个 DAG ,把所有边反向,得到的还是 DAG 。
所以答案是 乘上定向的方案数。
考虑钦定一些点作为 DAG 中入度为 的点,但是这样会算重。考虑,如果钦定 个点,就乘上 的容斥系数,这样就好了。
令 是子集 的答案, 是 ,则 。
复杂度是 。可以用子集卷积优化到 。
6.CF1787H Codeforces Scoreboard
先化成 的形式。我们可以看成每个式子在 或 中选一个。
考虑这些选了的。首先 就不影响了,并且我们会按 从大到小插入式子。
所以把全局的式子排序,令 表示考虑前 个,选了 个的最大权值,则 。令 。
考虑转移,一开始猜测 是上凸的,即 。然后维护差分数组。其实是对的,但是不好证明。
根据证明中的障碍,进一步猜测 ,这反而更好证明,且更好利用。证明如下:
考虑归纳证明,假设 至 都是满足条件的。
考虑转移的过程, 式子中的两个值,作差法得到 。 变成 ,前面这个式子的增加量就是 。所以这个式子是单调不减的。
是因为我们已经从大到小排序了。
我们令 是第一个满足 的 。 变化时 的变化:相当于 , , 。(如果不想看证明,即可用平衡树维护这个过程。)
对于 , 。对于 , 。
因为对于 ,都有 ,则 , 。
对于 , 。同 的证明,可以得到这是 的。
对于 ,同 的证明, 。
综上,对于任意 ,有 ,结论成立。
7.ABC288Ex A Nameless Counting Problem
我们计算 表示 个互不相同的数的答案,则之后同时插入两个数,答案为 。
考虑利用容斥计算,考虑任意两个数都要满足 ,我们钦定一些二元组 满足 进行容斥,连成的每个连通块的所有数要相等。
如果已经确定一个大小为 的连通块然后内部连边,则所有方案的系数和为 ,可以归纳发现。
钦定连通块的过程类似于一个 EGF , 卷一下就好了。就是求 表示 个点, 个大小为奇数的连通块(为偶数的,直接乘上 ,不影响异或和) 的方案数。
再算一个 表示任意 个数的答案。则 。
算 直接数位 dp,复杂度是 。
8.CF1787I Treasure Hunt
神题 。
我们设定 是最大前缀和的位置。考虑如果选择 ,那么把 赋值为 ,权值增加量为 ,一定是不劣的。所以一个序列的权值是:最大前缀和+最大子段和。
最大前缀和的和容易利用单调栈 算出。
最大子段和的和?考虑分治,计算跨越 mid 的区间的权值和。
时,令 表示 的最大的 , 表示 的最大子段和。
时,定义类似。
则问题转化为计算 ,这是二维偏序问题,可以 计算,则总复杂度为 。
有结论: 是单调不降的, 是单调不增的。利用这个就能维护三个指针,进行计算了,复杂度
给出 时的证明:
令考虑到 时,最大字段和是 ,最大前缀和是 。则根据本文一开始的讨论, 或 。
如果 ,则加入 时 。
若 :则加入 时分情况讨论:
-
将变成 ,。发现 。
-
不变,则 , 。
就证完了 。
9.CF1785E Infinite Game
考虑在状态中记下: 种初始比分,经过串 后会变成什么。
则最后, 经过 变成 ,会形成一个基环树。根据 0:0 能到达的环的权值和来判断结果。(权值就是指 A赢的次数 - B赢的次数)
枚举哪些比分最后会在环上的集合 ,则是 的形式,转移就好了。如果符合枚举的 ,就统计如答案。
这样做是 ,常数 。跑不满,跑满了也能过(
10.P7985 [USACO21DEC] Paired Up P
显然,如果钦定了参与匹配的牛,他们一定按坐标从小到大依次匹配。
T=1 时记 表示第一类牛考虑到 ,第二类牛考虑到 。因为满足最大就保证最大,所以 dp 一下就好了。
T=2 时需考虑“极大”的限制。
,其中 表示第一类牛最后一个没考虑的, 同理。
但 和 只用记靠后的一个。因为 和 差一定 ,那么靠前的那个点,无法影响更后面的点。
现在就变成 了。考虑何时 能变成另一类牛?
比如 是第一类,必定是某个时刻, ,然后第一类在 后,第二类在 后,匹配连续的一段,使得下一个未匹配的第二类 ,满足 。
于是状态就简化成 了, 可通过本题。
11.ABC215H Cabbage Master
考虑霍尔定理,选择一个右端点的集合。则在左端点的并集相同的情况下,一定会尽量多选来卡限制。
令 是左端点集合 ,使并集 的情况下的最大的 。
令 是 集合的 ,则第一问答案是 ,其中 。
考虑第二问,我们删去 个小球后,令这些小球覆盖的左端点集合为 ,则一定存在 使得 。
一个 是否合法就很容易判断。而这个并集恰好为 的限制,可以考虑构造 ,然后 IFMT 一下。
12.ABC289Ex Trio
题外话:f[i-l]=h[i] 写成 f[i]=h[i-l] 导致没有场切。以后打 ABC 只做 G 和 Ex,节省时间。(其实是这场被 F 卡了)
考虑 “ 是第一次三点合一的时刻” 这个限制,容斥,钦定一些时间会三点合一。
则算一个 表示经过 刻,从初始状态变成三点合一的方案数, 表示经过 刻,从三点合一变成三点合一的方案数。这俩都是能一遍卷积算出来的。
然后就 分治 FFT/多项式求逆 。
13.LOJ3075 「2019 集训队互测 Day 3」组合数求和
神题。
专门开了一篇写做法。
自己没想到的东西:
-
拆模数,求模数为 的答案后 CRT 合并。这是很常见的方法。
-
处理不好求逆元的多项式除法的神秘方法。
14.「WC2023 / CTS2023」楼梯
发现想清楚代码就不难写。
我们用 01 序列刻画轮廓线,从右上角开始,往下走为 0 ,往左走为 1。
用权值线段树维护,位置 表示第 个 后有多少个 ,则修改都是容易实现的。
考虑查询。发现一个子楼梯对应了一个子段 ,满足 ,且 就是边界格数。
现在查询相当于要取一对 使得 。
由题, ,且 为 倍数。那么考虑二分,初始 。如果 是 ,就令 ,否则 。
查 ,以及 后输出坐标,都可以利用线段树实现。
复杂度 。
15.AGC061C First Come First Serve
第一次场切 AGC 的 C,很激动。但是这场 A 做得太慢了(
简化题意:有两个长度为 的单调递增序列 和 ,并且不存在 。你可以使 等于 或者 。
一个排列 , 表示 中第 小的数的下标。问有多少种不同的 。 。
做法:
考虑对于 ,怎么构造出 。可以从左往右贪心构造:如果 ,则 ,否则 。
而一组 只会对应一个 。则一组 会在它对应的 的构造中被“采用”,当且仅当:如果存在 使 ,则必须存在 使得 。
由此,考虑容斥处理这个限制。钦定一些 ,使得 ,且不存在 使 。 我们称这个限制为, 都被 覆盖了。
考虑钦定了的数,它们覆盖的区间两两不交。
其次,如果有一个 ,两端都被覆盖了,则对答案贡献为 ;否则,贡献为 。
如果 两端都被覆盖,由于 和 单调递增,一定是相邻两个钦定了的区间 ,使得 。
我们记 表示,当前钦定集合末尾为 ,所有方案的贡献和。
能转移到的 一定是一个后缀,而这个范围可以二分两次求出。由此,我们以 的复杂度解决了此题。
16.CF765F Souvenirs
考虑把询问按右端点排序,然后加入 时,我们先考虑 的数对。
如果已经取到一个 ,则对于 ,必须满足 ,这个 才对答案的更新有用。
所以我们加入 时就一直按照上面的限制找下一个 ,由于 每次会减半,所以 只有 个。找 可以主席树实现,更新答案用 BIT。
复杂度 。
17.UOJ310 【UNR #2】黎明前的巧克力
FWT 练习题。
回忆 FWT :令 。
我们来回忆一下FWT: 。以及 IFWT, 。
把题意写成集合幂级数的形式: 。
对 施加 FWT 得到 ,考虑 ,如果 为奇数,则为 ,否则为 。
那我们对于每个 ,我们想算 ,只需统计出 即可。这恰好能用 FWT 计算。
而答案恰好是 ,因为 。
18.CF1672I PermutationForces
神题,难想难写。
令 初始为 。我们令第 个点是 。
显然一个贪心策略是每次删掉 最小的 。而对其他点的影响,就是两个矩形内的点 -1。
问题是怎么维护 ,怎么找最小。暴力 KDT 显然过不去。
我们以主对角线为界,分上下考虑。以上半部分为例,一个点 的 可能最小,当且仅当 是后缀最小值,读者自证不难。
只考虑这些点的话,矩阵加实际上就转化成了区间加。但删掉一个点,就会有一些新的点进入候选方案。可以用线段树二分来寻找这些点。
还有一个问题是,新加入一个点,怎么算它此时的 。可以用树状数组维护。
细节很多。我写得很烦。
代码(3.5k)
// LUOGU_RID: 102160828
#include<bits/stdc++.h>
using namespace std;
int n,p[501000];
struct BIT{
int tr[501000];
inline void add(int x,int z){for(;x<=n;x+=(x&-x))tr[x]+=z;}
inline int ask(int x){int s=0;for(;x;x-=(x&-x))s+=tr[x];return s;}
}K[2][2];
const int I=1e9;
struct qt{int f,is;};
qt min(qt a,qt b){return (a.f<b.f)?a:b;}
qt max(qt a,qt b){return (a.f>b.f)?a:b;}
struct SGT{
qt mi[2010000],mi2[2010000],mx[2010000];
int tag[2001000];
inline void build(int p,int l,int r){
mi[p]=(qt){I,l},mi2[p]={I,l};
mx[p]=(qt){-I,l};
if(l==r)return;
int mid=(l+r)>>1;
build(p<<1,l,mid),build(p<<1|1,mid+1,r);
}
inline void ad(int x,int z){tag[x]+=z,mi2[x].f+=z;}
inline void pd(int x){ad(x<<1,tag[x]),ad(x<<1|1,tag[x]),tag[x]=0;}
inline void up(int p,int l,int r,int x,int y,int y2,int z){
if(l==r){mi[p]=(qt){y,x};mi2[p]=(qt){z,x};mx[p]=(qt){y2,x};return;}
pd(p);int mid=(l+r)>>1;
if(x<=mid)up(p<<1,l,mid,x,y,y2,z);
else up(p<<1|1,mid+1,r,x,y,y2,z);
mi[p]=min(mi[p<<1],mi[p<<1|1]);
mi2[p]=min(mi2[p<<1],mi2[p<<1|1]);
mx[p]=max(mx[p<<1],mx[p<<1|1]);
}
inline void up2(int p,int l,int r,int x,int y,int z){
if(y<l||x>r)return;
if(x<=l&&r<=y)return ad(p,z);
pd(p);int mid=(l+r)>>1;
up2(p<<1,l,mid,x,y,z),up2(p<<1|1,mid+1,r,x,y,z);
mi[p]=min(mi[p<<1],mi[p<<1|1]);
mi2[p]=min(mi2[p<<1],mi2[p<<1|1]);
mx[p]=max(mx[p<<1],mx[p<<1|1]);
}
inline qt ask1(int p,int l,int r,int x,int z){
if(mi[p].f>z)return (qt){I,0};
if(l==r)return mi[p];
int mid=(l+r)>>1;
if(x<=mid)return ask1(p<<1,l,mid,x,z);
qt cp=ask1(p<<1|1,mid+1,r,x,z);
if(cp.is)return cp;
return ask1(p<<1,l,mid,mid,z);
}
inline qt ask2(int p,int l,int r,int x,int z){
if(mi[p].f>z)return (qt){I,n+1};
if(l==r)return mi[p];
int mid=(l+r)>>1;
if(x>mid)return ask2(p<<1|1,mid+1,r,x,z);
qt cp=ask2(p<<1,l,mid,x,z);
if(cp.is<=n)return cp;
return ask2(p<<1|1,mid+1,r,x,z);
}
inline qt ask3(int p,int l,int r,int x){
if(mx[p].f<x)return (qt){-I,n+1};
if(l==r)return mx[p];
pd(p);int mid=(l+r)>>1;
qt cp=ask3(p<<1,l,mid,x);
if(cp.is>n)return ask3(p<<1|1,mid+1,r,x);
else return cp;
}
}T[2][2];
int main(){
scanf("%d",&n);
int M=n+1;
for(int i=0;i<2;i++)for(int j=0;j<2;j++)T[i][j].build(1,1,n);
for(int i=1;i<=n;i++)scanf("%d",&p[i]);
for(int i=n;i;i--)
if(p[i]>=i){
if(M>p[i])M=p[i],T[0][0].up(1,1,n,i,p[i],p[i],p[i]-i);
else T[0][1].up(1,1,n,i,p[i],p[i],I);
}
M=n+1;
for(int i=1;i<=n;i++)if(p[i]<i){
if(M>n+1-p[i])M=n+1-p[i],T[1][0].up(1,1,n,n-i+1,n-p[i]+1,n-p[i]+1,i-p[i]);
else T[1][1].up(1,1,n,n-i+1,n-p[i]+1,n-p[i]+1,I);
}
int ans=-1,step=n;
while(step--){
int o=((T[0][0].mi2[1].f<T[1][0].mi2[1].f)?0:1);
int x=T[o][0].mi2[1].is;
int y=T[o][0].mi2[1].f;
T[o][0].up(1,1,n,x,I,-I,I);
ans=max(ans,y),y=(o?(n+1-p[n+1-x]):p[x]);
K[o][0].add(x,1),K[o][1].add(y,1);
int ii=T[o][0].ask3(1,1,n,y).is;
if(ii<=x)T[o][0].up2(1,1,n,ii,x,-1);
ii=T[o^1][0].ask3(1,1,n,n-y+1).is;
if(ii<=n-x+1)T[o^1][0].up2(1,1,n,ii,n-x+1,-1);
qt al=T[o][0].ask1(1,1,n,x,n),ar=T[o][0].ask2(1,1,n,x,n);
while(al.is+1<ar.is){
qt nx=T[o][1].ask1(1,1,n,ar.is-1,min(ar.f,n+1)-1);
if(al.is>=nx.is)break;
int u=nx.is,y=(o?(n+1-p[n+1-u]):p[u]);
int cs=y-u;
cs-=(K[o][0].ask(n)-K[o][0].ask(u))-(K[o][1].ask(n)-K[o][1].ask(y));
cs-=K[o^1][0].ask(n-u+1)-K[o^1][1].ask(n-y+1);
T[o][1].up(1,1,n,u,I,-I,I);
T[o][0].up(1,1,n,u,y,y,cs);
ar=nx;
}
}
return printf("%d",ans),0;
}
18.P5900 无标号无根树计数
学习 GF ing。
令 个点的无标号有根树方案 ,无标号无根树方案为 。如果已经计算出 ,我们考虑拎出重心,得到 。特别地,如果 为偶数,还要减去 。
如何算 ?考虑枚举有几个儿子,根据 burnside ,枚举所有置换求不动点的平均值。
令 。一个大小为 的环,这个环代表的 个树都要相同,然后内部连边方案 ,则它的 EGF 为 。
把他们拼起来,则 。(注意这里 EGF 的 和求平均数的 抵消了).
即: 。我们令 , 。
考虑两边求导: 。
。而 可以展开为 。
不难发现可以分治 FFT 解决:令 ,则 , 。
复杂度 。
19.ABC230H Bullion
和上面这个题类似,令 ( 是题中给出的金条体积的集合)(这里需要 exp)。
答案生成函数为 , ,则 。
和上面类似的化简可得 。分治 FFT 计算即可。
复杂度 。
20.ARC156D Xor Sum 5
考虑最后会贡献给答案的,肯定是 为奇数的 。
然后你发现, 在模 时得到 。
那我们将 二进制拆分,就得到 。由此可以从低到高数位 dp 。
21.ARC156E Non-Adjacent Matching
这种题一般都是先找一些必要条件,然后证充分性。
首先度数和 一定是偶数;其次考虑相邻两个不能连边能得到什么,卡一些极端情况试试,想到 。
发现这个确实是充分的,考虑 ,则连边 等同于除了 这四个数都要减 ,最后 要变成全 。
现在我们要让 一直非负。你会发现,如果 不超过两处为 ,那操作是容易的;如果有三处为 ,那肯定有相邻的 ,操作也是容易的。
为 的位置只会有不超过三处,读者自证不难。
然后计数就是容斥钦定一些位置 ,则要么钦定一处,要么钦定两处且相邻。
就容易算了,复杂度 。
22.P4128 [SHOI2006] 有色图/P4727 [HNOI2009]图的同构计数
复习 polya 定理。考虑枚举置换 计算不动点,即 和 颜色相同。
令每个环的大小分别为 ,则令 ,则不动点为 。
枚举 不现实,考虑枚举 的划分 ,填位置系数 ,内部连环系数 ,则对答案贡献为 。
注意到相等的 是会算重的,如果 在 出现 次,则还要乘上 。
最后除以 。
复杂度 。
23.CF1784F Minimums or Medians
考虑已经确定了哪些位置会被删,我们怎么判断能被构造出来。
发现含有 的这一段很重要,这一段越长,后面的操作越自由。
我们来找必要:每一段长度都是偶数;最右的位置 ;不包含 段要满足 。
手玩一下发现这很充分,于是对着这个计数就好了,复杂度 。
感觉这很 ATC,就是手玩找结论。
24.AGC061D Almost Multiplication Table
好神啊,这种调整法以前没见过捏。
先二分答案,得出 的上下界。
考虑把 设为 ,这一定是严格最小的 :如果存在合法解 ,一定有 。
得到 后,如果我们只考虑上界,一定能得到唯一的一组 ,严格最大。但这样就不满足下界了,再去调整 。一直做下去,直到找到合法解。
由于这样的操作每一步都是最优的,所以存在合法解,一定能到达。
考虑如何保证复杂度:我们钦定 ,如果 就退出调整,再对称的做一遍 。
这样的话,由于 ,所以 只会到达 的级别。
由于每次调整都会使至少一个 增加,所以调整轮数是 级别,这样子就保证了复杂度!
算上二分和每次调整的复杂度,总复杂度 。
25.P5434 有标号荒漠计数/LOJ6569 仙人掌计数
考虑一个 有根 仙人掌的 EGF 为 。这里钦定一个根是因为仙人掌本身结构与树相似。
考虑这个根,它会被一些边和环覆盖。 如果它在一个环上,则环上面另外 个点分别挂了一颗仙人掌(此处体现了有根的作用)的 EGF 是 。
除以 是因为环正着排和反着排是相同的。如果它在一个边上,则有 EGF 。
我们会把环和边叠起来,所以得到 。
我们来牛顿迭代,令 。
令 , ,可以得到 。
对着算就好了,复杂度 ,但是常数很恐怖。
26.ABC222H Beautiful Binary Tree
考虑每个 的位置,都要进行一次 的操作。所以根节点一定为 ,且 次操作只会在初始 的点进行。
如果存在两个相邻的点都是 ,显然就得多跳一次,不合法了。所以题目条件等同于:二叉树,根节点为 ,一共 个 ,叶子都是 ,不存在相邻的 ,求方案数。
考虑 ,分别表示根为 的答案。把它写成生成函数的形式: ,则有 (-1是因为叶子节点必须是 ), 。
则 。令 ,题目等同于求满足 的 。
根据拉格朗日反演,有 。代入得 。
接下来有两种求法:第一种是,考虑转化成 , 计算。
第二种是,考虑对 求导得到
即 。提取两边的 项系数,得到
。
即 ,递推即可,复杂度 。
27.ABC290Ex Bow Meow Optimization
这个题做不出来,感觉很无语。
场上先观察出来填权值是单峰的,两种数的中点所在的位置很重要,我们枚举这两个位置,然后 dp 。发现不太可做。
事实上它们的中点是贴在一起的,以 偶数为例,第 个猫左边的狗,如果多于 ,我们一定可以把这些多出来的狗移到猫的右边,发现一定不劣。
然后把所有动物的权值从大到小排序,我们一定会把当前的动物放在最左或最右。依次进行 dp 即可,状态中记录左半边有多少只猫/狗。复杂度 。
28.P5828 边双连通图计数
用双连通分量刻画普通的连通图。考虑先钦定根,观察根所在的双连通分量。
如果大小是 ,则删掉该分量后的若干连通图,都会在 个点中选一个连边。
所以,如果有根连通图的 EGF 是 , 个点的边双有根连通图有 个,则 。
记 EGF 为 ,则 。现在已知 ,如何计算 ?
考虑令 ,则 , 。
根据扩展拉格朗日反演, 。
直接计算即可,复杂度 。
29.P5827 点双连通图计数
类似地,观察根被哪些点双联通分量包含。
表示有根连通图的EGF。你会发现除了根以外,每个点下面都挂了一个有根无向图。
如果 个点的点双连通图(无根)是 ,令 ,则 。
如何计算?考虑 。令 ,则 , 。
。
直接计算即可,复杂度 。
30.P5293 [HNOI2019]白兔之舞
如果没有 大小限制,考虑答案就是 。
是 因数,并且是模 余 的形式,明示单位根反演。
。
后面这个式子只和 有关,可以 计算。然后 ,差卷积即可得到 。需要 MTT。
总复杂度 。白兔之舞,就这。
31.P4500 [ZJOI2018]树
考虑同构的一类树 ,它的编号方法是 ( 是以 为根子树的大小) ,而且一个节点 ,如果存在 棵子树同构,那么还要除以 。
我们设 , 是树 的大小,则答案是 。
。考虑令 ,我们想计算出 。
有 。经典取 ln , 。
观察上面的式子,考虑令 ,则上式变成 。
令 ,则继续化成 。
枚举 ,化成 。
发现 和 的定义非常相似,考虑对 添加一维,即令 ,发现这个式子就变成了 。
于是我们就能递推计算 了,算 的方法是类似的。
认真实现可以得到复杂度 ,就是能求前缀和/积的地方尽量求,能减少的枚举就减少。思路还是很自然的。
32.ARC157E XXYX Binary Tree
非常简单的题,但是因为提前去玩了就没仔细看,没看到二叉树的条件,寄飞了。这场思维量都很低。
考虑不存在相邻 的条件很关键,相当于 等于非叶子的 Y 个数 *2 , 等于 Y 个数 -[根是Y] 。
发现如果叶子结点的 Y 数量固定,那 Y 总个数是没有下界的。
表示以 为根的子树,取 个叶子为 Y ,Y 总个数最多是多少,然后树形 dp 转移即可。
33.ARC157F XY Ladder LCS
普通的求 LCS 是设 来转移。
于是此题的暴力就是设 表示第一个串考虑到 ,第二个串考虑到 , 每个位置是否交换的状态是 ,显然过不去。
发现答案会比较大。考虑找一个答案的下界,发现长度为 的时候答案至少为 ,长度为 时答案至少为 。于是长度为 时答案至少为 。
所以 dp 的时候 。复杂度是 。
34.ARC154F Dice Game
考虑计算丢第 次时刚好合法的概率: 。
如果令 ,则等同于要求 。
考虑计算出 为 转 OGF 的结果,则 的答案是 。
考虑 转 OGF 为 。
则通过分治 NTT ,可以把 算成一个 的形式。
接下来我们想求 的前 项,直接先算 , 处截断,再算 是错的,因为 有无限项。
先算 和 ,从 处截断,再算 ,可以发现就对了。
计算一个 的方式是算 ,这也能分治 NTT。
复杂度 。
35.P6633 [ZJOI2020] 抽卡
先把期望拆成:每个状态出现的概率*当前状态下抽到一张没出现的卡次数的期望 的和。其中一个状态要满足,不存在为 的连续段。如果状态有 张被抽,这个期望就是 ,到达的概率显然是 。
则对于每个 都要计算取了 张牌的合法状态数。
我们把题目中给出的编号划分成若干连续段,分别求答案再分治 NTT 合并。
接下来考虑连续一段的答案,设其长度为 。
考虑一种容斥:我们要求 全是 , 为 的情况不能出现。特别地,令 。
这样是方便计算的:令 ,则答案为 。
我们令 ,发现 。
令 ,则 。
于是可以分治计算,复杂度 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?