【原创】【NOI.AC模拟赛第五场】A.序列计数(count)

本文详细解析了一种针对特定序列的计数算法,该算法用于计算长度为n+1的序列中,每个长度从1到n+1的所有可能子序列的数量,并对结果进行10^9+7取模。文章探讨了算法的实现细节,包括如何处理重复元素和使用组合数学原理优化计算过程。

序列计数(count)

题目描述

长度为n+1的序列A,其中的每个数都是不大于n的正整数,且n以内每个正整数至少出现一次。

对于每一个正整数k=1,…,n+1,求出的本质不同的长度为k的子序列(不一定要连续)的数量。对109+7取模。

输入格式

第一行一个正整数n。

第二行n+1个正整数A1…An+1,描述序列A。

输出格式

n+1行,对于第i行,输出一个整数表示长度为i的本质不同子序列的数量,对10^9+7取模。

样例

input1

3
1 2 1 3

output1

3
5
4
1

explanation

长度为1的子序列有3个:1 ,2 ,3。

长度为2的子序列有5个:11 ,12 ,13,21,23。

长度为3的子序列有4个:121 ,123 ,113,213。

长度为4的子序列有1个:1213。

input2

见样例 ex_count2.in。

output2

见样例 ex_count2.out。

数据范围和约定

对于20%的数据,n≤20。

对于40%的数据,n≤2000。

对于额外20%的数据,保证A中相同的数一定相邻。

对于100%​的数据,n≤100000​,1≤Ai≤n​。

时间限制:1s 空间限制:512MB

真的没有时间和心情写博客所以就把考试写的思路发上来了所以语无伦次我自己也有些看不懂非常抱歉请求谅解

10
5 2 6 8 4 3 9 1 4 7 10
left=5
right=9

重复的元素记为rix
考虑left和right出现在同一位置的可能性,这样就本质相同了,此时应减去其情况数

设当前选i个,rix出现在第j位上。
先考虑左边的那个rix
a1 a2 a3 … aj-1 rix aj+1 … ai
则a1~aj-1都是rix之前的,aj+1到ai都是rix之后的
情况数为C(lef−1,j−1)∗C(i−lef,i−j)C(lef-1,j-1)*C(i-lef,i-j)C(lef1,j1)C(ilef,ij)

考虑lef,rig两种情况中重复的选择情况数为:
C(lef−1,j−1)∗C(N+1−rig,i−j),C(lef-1,j-1)*C(N+1-rig,i-j),C(lef1,j1)C(N+1rig,ij),
j∈[1,i]且满足lef-1>=j-1,N+1-rig>=i-j,
所以j∈[max(1,i+rig-N-1),min(i,lef)]
故答案为:C(N+1,i)−ΣC(lef−1,j−1)∗C(N+1−rig,i−j)(j的范围如上)C(N+1,i)-ΣC(lef-1,j-1)*C(N+1-rig,i-j)(j的范围如上)C(N+1,i)ΣC(lef1,j1)C(N+1rig,ij)j

这个方法对所有i∈[1,N+1]成立
可是这个做法是O(N^2)的
肯定过不了
肯定会被大佬嘲笑
所以要么优化要么换一个方法
反正答案应该是O(N)的吧
优化就是一个思路:
考虑能不能把那个Σ变成O(1)的
怎么变成O(1)的呢?
1.考虑通过神奇的数学公式变成O(1)的
2.考虑有没有递推关系

主要是把减数那一坨Σ化简,发现C(lef−1,j−1)可以提出来,所以ΣC(lef−1,j−1)∗C(N+1−rig,i−j)=C(lef−1,j−1)∗ΣC(N+1−rig,i−j)。其中i−j的范围为(i−j)∈[i−min(i,lef),i−max(1,i+rig−N−1)]。主要是把减数那一坨Σ化简,发现C(lef-1,j-1)可以提出来,所以ΣC(lef-1,j-1)*C(N+1-rig,i-j)=C(lef-1,j-1)*ΣC(N+1-rig,i-j)。其中i-j的范围为(i-j)∈[i-min(i,lef),i-max(1,i+rig-N-1)]。ΣC(lef1,j1),ΣC(lef1,j1)C(N+1rig,ij)=C(lef1,j1)ΣC(N+1rig,ij)ij(ij)[imin(i,lef),imax(1,i+rigN1)]

我们再来化简ΣC(N+1-rig,i-j)。

先把类分开来讨论:
①1&lt;=i+rig−N−1时:即i&gt;=N−rig+2时:① 1&lt;=i+rig-N-1时:即i&gt;=N-rig+2时:1<=i+rigN1i>=Nrig+2
Ⅰ.i&lt;=lef时,i−j∈[0,N+1−rig],ΣC(N+1−rig,i−j)就可以很偷税地二项式定理,此时原式=C(lef−1,j−1)∗(2(N+1−rig))Ⅰ. i&lt;=lef 时,i-j ∈[0,N+1-rig] , ΣC(N+1-rig,i-j) 就可以很偷税地二项式定理,此时原式=C(lef-1,j-1)*(2^(N+1-rig)).i<=lefij[0,N+1rig],ΣC(N+1rig,ij)=C(lef1,j1)(2(N+1rig))
Ⅱ.i&gt;lef时,i−j∈[i−lef,N+1−rig],可以先求一个前缀和,再用二项式定理减去这个前缀和,此时原式=C(lef−1,j−1)∗(2(N+1−rig)−(C(N+1−rig,0)+C(N+1−rig,1)+...+C(N+1−rig,i−lef)))Ⅱ. i&gt;lef 时,i-j ∈[i-lef,N+1-rig],可以先求一个前缀和,再用二项式定理减去这个前缀和,此时原式=C(lef-1,j-1)*(2^(N+1-rig)-(C(N+1-rig,0)+C(N+1-rig,1)+...+C(N+1-rig,i-lef))).i>lefij[ilef,N+1rig]=C(lef1,j1)(2(N+1rig)(C(N+1rig,0)+C(N+1rig,1)+...+C(N+1rig,ilef)))
然后这两种情况其实可以合并,只需要令下标为负数的前缀和为0即可。
(或者干脆if一下合什么并有神经病)

②i<N-rig+2时:
Ⅰ. i<=lef 时,i-j ∈[0,i-1] , 发现也是前缀和,而且不需要二项式定理。
Ⅱ. i>lef 时,i-j ∈[i-lef,i-1],前缀和也可以解决,而且不需要二项式定理。

没有代码

P10496dist NOI/NOI+/CTSC NOI 标准IO 传统题 来源 ningliang 时间限制 1000ms 内存限制 1024MB 题目描述 有 𝑛 n 个人,编号为 1 , 2 , ⋯   , 𝑛 1,2,⋯,n,他们进行了 𝑚 m 场比赛。 第 𝑘 k 场比赛的排行榜用序列 𝑎 𝑘 a k ​ 表示,第 𝑖 i 个表示排名为 𝑖 i 的人的编号。 定义 𝑥 x 和 𝑦 y 两个人的 “差距” 为个尽可能小的整 𝑙 l,使得: 存在长度为 𝑙 + 1 l+1序列 𝑏 b。 𝑏 1 = 𝑥 , 𝑏 𝑙 + 1 = 𝑦 b 1 ​ =x,b l+1 ​ =y 对于所有 𝑗 ∈ [ 1 , 𝑙 ] j∈[1,l], 𝑏 𝑗 b j ​ 至少场比赛中的排名比 𝑏 𝑗 + 1 b j+1 ​ 高。 有 𝑞 q 次询问,每次询问你需要回答某两个人的 “差距”。 输入格式 第行两个整 𝑛 , 𝑚 n,m。 接下来 𝑚 m 行,其中第 𝑘 k 行包含 𝑛 n 个整 𝑎 𝑘 , 1 , ⋯   , 𝑎 𝑘 , 𝑛 a k,1 ​ ,⋯,a k,n ​ ,表示第 𝑘 k 场比赛的排行榜。 接下来个整 𝑞 q。 接下来 𝑞 q 行,每行两个整 𝑥 , 𝑦 x,y,你需要求出 𝑥 , 𝑦 x,y 的 “差距”。 输出格式 输出 𝑞 q 行,每行个整回答询问,如果无解输出 − 11。 样例 样例输入 #1 运行 复制 6 2 1 3 2 5 4 6 2 1 4 3 6 5 4 1 4 5 3 6 1 5 2 样例输出 #1 复制 1 2 5 3 样例输入/输出 #2~5 见下发文件中 dist2~5.in 与 dist2~5.ans,分别对应第 2 2、 3 3、 5 5、 6 6 个子任务。 据范围 对于所有据,有: 2 ≤ 𝑛 ≤ 10 5 2≤n≤10 5 1 ≤ 𝑚 ≤ 5 1≤m≤5 每场模拟赛的排行榜是个排列。 1 ≤ 𝑞 ≤ 10 5 1≤q≤10 5 𝑥 ≠ 𝑦 x  =y 子任务 特殊性质 分值 1 1 𝑚 = 1 m=1 10 10 2 2 𝑛 , 𝑞 ≤ 500 n,q≤500 15 15 3 3 𝑛 , 𝑞 ≤ 2000 n,q≤2000 15 15 4 4 𝑎 𝑘 , 𝑥 , 𝑦 a k ​ ,x,y 在范围内随机生成 25 25 5 5 𝑛 , 𝑞 ≤ 2 × 10 4 n,q≤2×10 4 15 15 6 6 无 20 20 使用c++
最新发布
08-16
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值