@noi.ac - 489@ shuffle
@description@
给定一个长度为 n 的序列 s1,s2,…,sn,它有 2^n−1 个非空子序列。请对于每个 k=0,1,2,…,n 统计 s 有多少非空子序列 a 经过重排成 b 后,ai = bi 的位置数量的最小可能值恰好为k。
input
第一行包含一个正整数 n ,表示序列的长度。
第二行包含 n 个正整数 s1,s2,…,sn,表示序列s。
output
输出 n+1 行,每行输出一个整数,第 i 行输出 k = i+1 的非空子序列数量。因为答案可能很大,请对 1000000007(=10^9+7) 取模输出。
sample input
5
2 3 2 5 5
sample output
18
11
2
0
0
0
对于 100% 的数据,1≤si≤n,n≤250000。
@solution@
不难观察发现,序列重排后与原位置相同的位置数最小可能值只与这个序列的众数有关。
(1)当 2*众数的出现次数 ≤ 序列长度 时,最小可能值为 0。
易证。具体操作方法是每次选择某个众数和其他的数交换。可以归纳验证该方法的可行性。
(2)否则,最小可能值 = 2*众数的出现次数 - 序列长度。
保留这些位置的数不动,然后就可以归纳到上面那一种情况。
枚举众数是哪个数。
因为情况(1)不好考虑,所以我们只考虑情况(2),用总数(2^n - 1)减去情况(2)的方案数就可以得到情况(1)的方案数。
考虑枚举出来的众数为 a,它的出现次数为 t,我们所选取的子序列长度为 l,其中包含 a 的个数为 x。
则:
\]
因为所有数的出现次数总和为 n,均摊下来是一个 O(n^2) 的算法。
标算使用的是卷积优化,但是模数实在有些恶心,所以我们机房的大佬想出来另一种算法爆踩标算:
先换元:令 d = 2*x - l,消去 l。可以得到:
\]
由组合数的简单性质,可得:
\]
考虑其组合意义,可以发现它等于:
\]
然后均摊 O(n),代码复杂度、时间复杂度、思维复杂度三重爆踩标算。
@accepted code@
#include<cstdio>
const int MOD = int(1E9) + 7;
const int MAXN = 250000 + 5;
inline int add(int x, int y) {return (x + y) % MOD;}
inline int sub(int x, int y) {return add(x, MOD-y);}
inline int mul(int x, int y) {return 1LL*x*y % MOD;}
int pow_mod(int b, int p) {
int res = 1;
while( p ) {
if( p & 1 ) res = mul(res, b);
b = mul(b, b);
p >>= 1;
}
return res;
}
int a[MAXN], cnt[MAXN], ans[MAXN], n;
int fct[MAXN], inv[MAXN];
void init() {
fct[0] = 1;
for(int i=1;i<=n;i++)
fct[i] = mul(fct[i-1], i);
inv[n] = pow_mod(fct[n], MOD - 2);
for(int i=n-1;i>=0;i--)
inv[i] = mul(inv[i+1], i + 1);
}
inline int comb(int n, int m) {
if( n < m ) return 0;
else return mul(fct[n], mul(inv[m], inv[n-m]));
}
int main() {
scanf("%d", &n); init();
for(int i=1;i<=n;i++) {
int x; scanf("%d", &x);
a[x]++;
}
for(int i=1;i<=n;i++)
cnt[a[i]]++;
ans[0] = sub(pow_mod(2, n), 1);
for(int t=1;t<=n;t++)
if( cnt[t] )
for(int d=1;d<=t;d++)
ans[d] = add(ans[d], mul(cnt[t], comb(n, t-d)));
for(int i=1;i<=n;i++)
ans[0] = sub(ans[0], ans[i]);
for(int i=0;i<=n;i++)
printf("%d\n", ans[i]);
}
@details@
康复计划 - 2。
如果没有 zxb 与 typ 大佬的开导我可能真的要去写 拆系数fft/三模数ntt。
大佬您们太强了 orz。
顺便好像 typ 大佬是用的打表找到的规律,太强了我肯定看半天都看不出来规律 orz。
果然组合数学就是瞎搞公式2333
@noi.ac - 489@ shuffle的更多相关文章
- # NOI.AC省选赛 第五场T1 子集,与&最大值
NOI.AC省选赛 第五场T1 A. Mas的童年 题目链接 http://noi.ac/problem/309 思路 0x00 \(n^2\)的暴力挺简单的. ans=max(ans,xor[j-1 ...
- NOI.ac #31 MST DP、哈希
题目传送门:http://noi.ac/problem/31 一道思路好题考虑模拟$Kruskal$的加边方式,然后能够发现非最小生成树边只能在一个已经由边权更小的边连成的连通块中,而树边一定会让两个 ...
- NOI.AC NOIP模拟赛 第五场 游记
NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...
- NOI.AC NOIP模拟赛 第六场 游记
NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...
- NOI.AC NOIP模拟赛 第二场 补记
NOI.AC NOIP模拟赛 第二场 补记 palindrome 题目大意: 同[CEOI2017]Palindromic Partitions string 同[TC11326]Impossible ...
- NOI.AC NOIP模拟赛 第一场 补记
NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...
- NOI.AC NOIP模拟赛 第四场 补记
NOI.AC NOIP模拟赛 第四场 补记 子图 题目大意: 一张\(n(n\le5\times10^5)\)个点,\(m(m\le5\times10^5)\)条边的无向图.删去第\(i\)条边需要\ ...
- NOI.AC NOIP模拟赛 第三场 补记
NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...
- NOI.AC WC模拟赛
4C(容斥) http://noi.ac/contest/56/problem/25 同时交换一行或一列对答案显然没有影响,于是将行列均从大到小排序,每次处理限制相同的一段行列(呈一个L形). 问题变 ...
随机推荐
- IO流6 --- FileReader中使用read(char[] cbuf)读入数据 --- 技术搬运工(尚硅谷)
FileReader 字符输入流 @Test public void test2(){ File file = new File("hello.txt"); FileReader ...
- bzoj3064/洛谷P4314 CPU监控【线段树】
好,长草博客被催更了[?] 我感觉这题完全可以当作线段树3 线段树2考加法和乘法标记的下放顺序,这道题更丧心病狂[?] 很多人可能跟我一样,刚看到这道题秒出思路:打一个当前最大值一个历史最大值不就完事 ...
- 【并查集模板】 【洛谷P2978】 【USACO10JAN】下午茶时间
P2978 [USACO10JAN]下午茶时间Tea Time 题目描述 N (1 <= N <= 1000) cows, conveniently numbered 1..N all a ...
- composer本地安装文档 - CSDN博客
1.下载下图2个文件 2.将上图2个文件放到php根目录下与php.exe再同一目录 3.在composer.bat写 4.配置环境变量(将php目录复制到环境变量里) 5.将php.ini配置文件的 ...
- Django用户名密码错误提示
from django.shortcuts import render # Create your views here. from django.shortcuts import render fr ...
- 2017年2月27日Unicorn, US (148) and China (69), followed by the U.K. (10), India (9), Israel (5) and Germany (5).
Revisiting The Unicorn Club Get to know the newest crowd of billion dollar startups In 2013, when Ai ...
- linux系统搭建zookeeper集群
转载至:https://blog.csdn.net/weixin_38111957/article/details/82927878 一.引言 今天咱们就来搭建一下zookeeper集群,当然搭建集群 ...
- Nginx 对访问量的控制
目的 了解 Nginx 的 ngx_http_limit_conn_module 和 ngx_http_limit_req_module 模块,对请求访问量进行控制. Nginx 模块化 nginx ...
- 值得研究的J2EE开源项目推荐
导读:笔者在学习J2EE的过程中发现了一些很有用,而且很值得学习的开源项目,在此推荐给大家. 关键词:J2EE 开源项目 J2SE JBoss SOA EJB 这篇文章写在我研究J2SE.J2EE ...
- 云数据库将进入企业级百万IOPS时代
IOPS (Input/Output Operations Per Second),即每秒进行读写(I/O)操作的次数,以衡量存储每秒可接受多少次主机发出的访问.数据库,特别是关系型数据库由于需要处理 ...