首页 > 其他分享 >LOJ2834 「JOISC 2018 Day 2」修行

LOJ2834 「JOISC 2018 Day 2」修行

时间:2024-02-20 18:22:21浏览次数:38  
标签:typedef LOJ2834 limits ll JOISC 2018 binom sum mod

LOJ 传送门

考虑若已求出钦定 \(k\) 个升高的排列数量 \(f_k\),那么二项式反演就可以求出恰好 \(k\) 个升高的排列数量 \(g_k\),即:

\[g_k = \sum\limits_{i = k}^n (-1)^{i - k} \binom{i}{k} f_i \]

考虑求 \(f_i\)。相当于钦定原序列构成了 \(n - k\) 个上升段。相当于把 \(n\) 个数分成 \(n - k\) 个互相区分的集合,每个集合内部升序排序就是上升段。所以:

\[f_i = \begin{Bmatrix} n \\ n - i \end{Bmatrix} (n - i)! \]

直接 NTT 求一行的斯特林数可以通过 P5825 排列计数,但是这题的模数只能 MTT。考虑用斯特林数的通项公式展开,把 \(f_i\) 代入 \(g_k\):

\[\begin{aligned} g_k & = \sum\limits_{i = k}^n (-1)^{i - k} \binom{i}{k} \sum\limits_{j = 1}^{n - i} (-1)^{n - i - j} j^n \binom{n - i}{j} \\ & = \sum\limits_{j = 1}^n (-1)^{n + k + j} j^n \sum\limits_{i = k}^{n - j} \binom{i}{k} \binom{n - i}{j} \\ & = \sum\limits_{j = 1}^n (-1)^{n + k + j} j^n \binom{n + 1}{k + j + 1} \end{aligned} \]

最后一步用到了这个恒等式:\(\sum\limits_i \binom{i}{a} \binom{n - i}{b} = \binom{n + 1}{a + b + 1}\)。组合意义即为考虑 \(n + 1\) 个物品中选 \(a + b + 1\) 个,枚举第 \(a + 1\) 个物品的位置,加上左边选 \(a\) 个的方案数乘上右边选 \(b\) 个的方案数。

直接快速幂计算 \(i^n\) 就是 \(O(n \log n)\) 的,也可以线性筛做到 \(O(n)\)。

code
// Problem: #2834. 「JOISC 2018 Day 2」修行
// Contest: LibreOJ
// URL: https://loj.ac/p/2834
// Memory Limit: 256 MB
// Time Limit: 600 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 100100;
const ll mod = 1000000007;

inline ll qpow(ll b, ll p) {
	ll res = 1;
	while (p) {
		if (p & 1) {
			res = res * b % mod;
		}
		b = b * b % mod;
		p >>= 1;
	}
	return res;
}

ll n, m, fac[maxn], ifac[maxn];

inline ll C(ll n, ll m) {
	if (n < m || n < 0 || m < 0) {
		return 0;
	} else {
		return fac[n] * ifac[m] % mod * ifac[n - m] % mod;
	}
}

void solve() {
	scanf("%lld%lld", &n, &m);
	fac[0] = 1;
	for (int i = 1; i <= n + 1; ++i) {
		fac[i] = fac[i - 1] * i % mod;
	}
	ifac[n + 1] = qpow(fac[n + 1], mod - 2);
	for (int i = n; ~i; --i) {
		ifac[i] = ifac[i + 1] * (i + 1) % mod;
	}
	m = n - m;
	ll ans = 0;
	for (int i = 1; i <= n; ++i) {
		ans = (ans + (((n + m + i) & 1) ? mod - 1 : 1) * qpow(i, n) % mod * C(n + 1, m + i + 1)) % mod;
	}
	printf("%lld\n", ans);
}

int main() {
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:typedef,LOJ2834,limits,ll,JOISC,2018,binom,sum,mod
From: https://www.cnblogs.com/zltzlt-blog/p/18023760

相关文章

  • 研究生阶段 2018.11.1 编程 我的微信小程序
    微信小程序昵称:HelloPrince2017原始ID:gh_5c258db11408登录邮箱:[email protected]你好,以上帐号未在指定时间内登录,此帐号已冻结,如需重新使用此帐号,请登录小程序帐号后台进行找回;或在公众平台找回帐号流程中,通过原始ID搜索找回  "找回小程序登录密码"  发......
  • 24/02/14 [BJWC2018] 八维
    今天是情人节,而且今年是永夜抄正式版发行20周年(咏唱组20周年)。放一张我喜欢的咏唱:题目描述我们将一个\(M\)行\(N\)列的字符矩阵无限复制,可以得到一个无限字符矩阵。例如,对于以下矩阵:\[\begin{aligned}&\verb!honi!\\&\verb!hsin!\\\end{aligned}\]可以无限复......
  • LOJ #2876. 「JOISC 2014 Day2」水壶 题解
    DescriptionJOI君所居住的IOI市以一年四季都十分炎热著称。IOI市被分成\(H\)行,每行包含\(W\)块区域。每个区域都是建筑物、原野、墙壁之一。IOI市有\(P\)个区域是建筑物,坐标分别为\((A_1,B_1),\)\((A_2,B_2),\)\(\ldots,\)\((A_P,B_P)\)。JOI君只能进入建......
  • P8667 [蓝桥杯 2018 省 B] 递增三元组
    二分计数#include<iostream>#include<stdio.h>#include<algorithm>#include<string>#defineFor(i,j,n)for(inti=j;i<=n;++i)usingnamespacestd;constintN=1e5+5;intn,arr[3][N],base[N];longlongans;int......
  • P4559 [JSOI2018] 列队 题解
    题目链接:列队半年前mark的题,结果现在一下子就会做了。顺便写写我的手玩过程和复杂度说明。考虑比较特殊的情况:比较特殊的,发现从黑色到红色区间我们无论咋选择,由于\(\left|a_{right}-a_{left}\right|\),这玩意如果\(right\)表示红色的一边,那么这个绝对值可以直接拆掉,那么......
  • P8674 [蓝桥杯 2018 国 B] 调手表
    原题链接题解一道思维题由于闹钟是圆的,所以从任意一个分钟数调到另外任意一个分钟数最多要按多少次相当于从点0调到1~n-1任意一点最多要按多少次可以把1~n看成一个一个点,就相当于单源最短路了md,好巧妙code#include<bits/stdc++.h>usingnamespacestd;structrefresh{......
  • JOISC 2018 题解
    JOISC2018loj上有几乎全部的题目,写了题意的就是loj上没有的。D1T1简单题。根据颜色段均摊的结论,每个点到根的路径上颜色段的总和是\(O(n\logn)\)的,于是直接每次暴力找颜色段即可。复杂度\(O(n\log^2n)\)。提交记录D1T2又是计算几何。我们需要画出一条闭合折线,并且......
  • JOISC 2017 题解
    JOISC2017loj上有几乎全部的题目,写了题意的就是loj上没有的。D1T1开场放大。首先,对于一个点,它最后覆盖的一定是一个矩形,这就意味着如果我们知道了\(u,d,l,r\)操作各用了多少次,他们之间的顺序是不重要的,我们可以直接当做把一种操作做完再做剩下的操作,这样就可以做到\(O(......
  • JOISC 2016 题解
    JOISC2016loj上有几乎全部的题目,写了题意的就是loj上没有的。D1T1一开始把题目看错了,还写了棵线段树。把询问离线,倒着扫一遍,就变成了求最长不上升子序列,用树状数组维护即可。提交记录D1T2来自Kubic的神仙做法。考虑Filp一个位置和剩下所有位置,记录每个数作为答案......
  • JOISC 2015 题解
    JOISC2015loj上有几乎全部的题目,写了题意的就是loj上没有的。D1T1简单题。因为\(k\)很小,考虑依次确定最后第\(i\)位是什么。我们倒序考虑所有操作,维护最后第\(i\)位当前在第几位,就可以一直推下去。提交记录D1T2直接暴力复杂度就是\(O(k4^k)\)的,可以通过。提交......