@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形). 问题变 ...
随机推荐
- Linux 下安装和使用 Redis
系统: CentOS-7-1611 首先安装gcc 因为要make编译 参照官网 wget 下载包 解压 make 编译完成后会在src目录下生成几个可执行文件 然后执行:make install ...
- 【CODEVS】2618 核电站问题
2618 核电站问题 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 一个核电站有N个放核物质的坑,坑排列在一条直 ...
- 如何在CentOS 7 / Fedora 31/30/29上安装ELK Stack
原文地址:https://computingforgeeks.com/how-to-install-elk-stack-on-centos-fedora/ 原作者: Josphat Mutai 译者: ...
- Ubuntu下安装Mongo方法
场景:Ubuntu14下安装mongo,建议不要使用apt-get install 的命令安装,因为版本比较老 1.deb下载地址(可以自行选择OS,版本,server或tool或shell)http ...
- WPF ScrollViewer嵌套Listbox无法滚动
最近在做项目的时候,发现listBoxzi自带的垂直滚动条有问题,经常在Add(item)的时候下面会多出一些空白的部分,而且滚动条的长度也是无规则的,一会大一会小,而且无法控制横竖滚动条的显隐藏,并 ...
- 替换文本:将文本文件中的所有src替换为dst
题意: 将文本文件中的所有src替换为dst 方法一:使用String import java.io.File; import java.io.FileNotFoundException; impor ...
- python-None
今天偶然间,有人问了一个问题,项目中出现了一个这样的错误. 看到后,就想到是前后数据类型不一致.当时他定义了一些默认初始值为None(刚接触python代码,之前是c,java),然后就后边出现了这样 ...
- 在maven多模块结构中,并且使用overlay的情况下使用jetty热部署
在使用maven多模块的结构的时候,同时有多个web工程使用maven-war-plugin的overlay来组织的时候,本地开发时如何在eclipse里面启动容器并且可以热部署调试是个比较麻烦的问题 ...
- 递归系列——树型JSON数据转换问题
JSON数据转换方式: 1.标准结构=>简单结构 var root = { id: 'root', children: [ { id: "1", children: [ { ...
- Nginx教程(7) 正向代理与反向代理【总结】 (转)
1.前言 最近工作中用到反向代理,发现网络代理的玩法还真不少,网络背后有很多需要去学习.而在此之前仅仅使用了过代理软件,曾经为了访问google,使用了代理软件,需要在浏览器中配置代理的地址.我只知道 ...