题解-Atcoder_agc005D ~K Perm Counting】的更多相关文章

Problem AtCoder-agc005D 题意概要:给出\(n,k\),求合法的排列个数,其中合法定义为任何数字所在位置与自身值差的绝对值不为\(k\)(即求排列\(\{A_i\}\),使得\(\forall i\in[1,n],|a_i-i|\not =k\) Solution 刚看这道题时除了全集取反搞容斥外没有任何思路啊 \(f_i\)表示排列中至少有\(i\)对冲突的方案数,一对冲突定义为存在一个\(i\)使得\(|a_i-i|=k\) 考虑全集取反,加上一点点容斥思想可得 \[A…
[Agc005D] K Perm Counting Description 糟糕爷特别喜爱排列.他正在构造一个长度为N的排列.但是他特别讨厌正整数K.因此他认为一个排列很糟糕,当且仅当存在至少一个i(1≤i≤N),使得|ai-i|=K 他想知道,对于N!个排列,有多少个是不糟糕的?由于答案很大,他只想知道答案对924844033取模后的结果. Input 第一行两个正整数N和K(2≤N≤2000,1≤K≤N-1) Output 输出有多少个排列是不糟糕的(对924844033取模) Sample…
D - ~K Perm Counting 链接 题意: 求有多少排列对于每个位置i都满足$|ai−i|!=k$.n<=2000 分析: 容斥+dp. $answer = \sum\limits_{i = 0}^{n}(-1)^ig[i] \times (n - i)!$ $g[i]$表示至少存在I个位置满足$a[i] - i = k$个数. 考虑如何求出$g[]$. 如果建立两列点,一个表示数字,一个表示下标,左边第i个点与右边第i-k和i+k个点连边,那么这是一张二分图,g[i]就是求满足有刚…
题目链接 \(Description\) 给定\(n,k\),求 满足对于所有\(i\),\(|a_i-i|\neq k\)的排列的个数. \(2\leq n\leq 2000,\quad 1\leq k\leq n-1\). \(Solution\) 容斥.则\(Ans=\sum_{i=0}^n(-1)^ig(i)(n-i)!\),其中\(g(i)\)为至少有\(i\)个位置满足\(|a_i-i|=k\)的排列数. 考虑如何计算\(g(x)\).每个\(i\)向\(i+k\)和\(i-k\)连…
题面 传送门 思路 首先可以明确的一点是,本题中出现不满足条件的所有的数,都是分组的 只有模$K$意义下相同的数之间才会出现不满足条件的情况,而且仅出现在相邻的情况 那么我们考虑把这个性质利用起来 我们单独把其中一组抽出来考虑:设这一组为$p,p+k,p+2k,p+3k.....$ 那么我们发现,这其中每两个相邻的数之间都是互相不能选的 但是要注意,我们本题中讨论的实际上更应该是值和位置的关系,所以此时就变成了这样的形式: 位置$p+ki$不能选数$p+k(i+1)$,位置$p+ki(i+1)$…
AT2602 , Luogu 求对于 \(n\) 个数的排列 , 有多少种方案满足对于所有的 \(i\) , \(|P_i - i| != K\) , 答案对 \(924844033\) 取模 . \(n,K \le 2000\) 设 \(g[i]\) 表示至少有 \(i\) 个数不满足题意的方案数 , 则 \(ans = \sum_{i=0}^n (-1)^{i} g[i]\) . 可以画一个二分图 , 左边表示下标 , 右边表示取值 , 相隔 \(K\) 格的左右连一条边 . 网上有一个图…
题目大意 求有多少中1~n的排列,使得\(abs(第i个位置的值-i)!=k\) 解题思路 考虑容斥,\(ans=\sum_{i=0}^{n}(-1)^ig[i](n-i)!(g[i]表示至少有i个位置是不合法的方案数)\) 考虑如何求g[i] 将每个位置和每个值都作为一个点,有2n个点,如果第i位置不可以填j,将位置i向值j连边. 这样,就得到了一个二分图,问题就变成了选i条边的方案数. 将二分图的每条链拉出来,并在一起,就形成2n个点排成一排,一些相邻点之间有边. 设\(f[i][j][0/…
题目描述 有N个数,每个数的范围是[-50,50],现在你要从这N个数中选出K个,使得这K个数的乘积最大. 输入格式 第一行,N和K. 1 <= N <= 50.  1 <= K <= 10. 第二行,N个整数. 输出格式 一个整数. 输入样例 5 36  9  -5  -6  4 输出样例 270 题解 容易想到贪心策略:答案必有偶数个负数.则枚举负数数量在乘上剩下的非负数数量即可.这里用前缀积可以更快. #include <iostream> #include &l…
题面 背景 输入 输出 翻译(渣自翻) 给定K个包含K个数字的表,要求将其能产生的\( k^{k} \)个值中最小的K个输出出来 题解 k路归并问题的经典问题 可以转化为二路归并问题求解 考虑A[],B[]两个有序数组 使用堆,记录一些二元组\( (x,y) \),x表示值,y表示对应的b的下标,因为我们是把b合并到a上,所以我们能够根据记录的下标推出后面的值 然后两两合并 所以就很简单 放代码 #include <cstdio> #include <algorithm> #inc…
分块\(yyds\) ----关于线段树合并的题我用分块过掉这件事 题目传送门 先说正解 正解当然是线段树合并等一类做法了 至于解析...出门右转题解区第一篇 (就是他让我看不懂,然后用分块打的\(QAQ\)) 给出 fengwu 的\(code\) #include<bits/stdc++.h> #include<iostream> using namespace std; #define re register int const int N=100005; int n; in…