题解-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\)

考虑全集取反,加上一点点容斥思想可得

\[Ans=\sum_{i=0}^n(-1)^i\cdot (n-i)!\cdot f_i\]

至于怎么得到\(f_i\),就是这道题难点所在,关键思路是画图

构建一个二分图:

  • 其中\(i\)为数值\(i\),\(i‘\)为\(i\)在排列中的位置编号
  • 构建边为冲突,即所有\(i‘\)要和\(i\pm k\)连边

就像这样(模拟\(n=4,k=1\)的情况):

发现这个二分图中其实只有\(2k\)条链,于是可以对这\(2k\)条链进行Dp

在某条链上:设\(g[i][j][0/1]\)表示考虑前\(i\)个点,且已经有\(j\)对冲突,\(i\)号与\(i+1\)号连与不连的方案数,得出转移方程:

\[g[i][j][0]=g[i-1][j][0]+g[i-1][j][1]\\g[i][j][1]=g[i-1][j-1][0]\]

对于每条链的\(f[i]\)即为\(g[end][i][0]+g[end][i][1]\)(\(end\)为链的末尾),最后合并\(2k\)条链的时候可以玩背包

但实际上有个小技巧,就是将\(2k\)条链首尾顺次相接,在两条链的交界处不转移第二个方程即可

Code

#include <cstdio>

const int N=2040,p=924844033;
int f[N+N][N][2];
bool end[N+N];
int n,k,Ans,fac[N];

inline int qm(int x){return x<p?x:x-p;}

int main(){
    scanf("%d%d",&n,&k);fac[0]=1;
    for(int i=1;i<=n;++i)fac[i]=1ll*fac[i-1]*i%p;
    for(int i=1,tt=0,d;i<=k;++i){
        d=(n-i)/k+1;
        tt+=d,end[tt]=true;
        tt+=d,end[tt]=true;
    }
    f[1][0][0]=1;
    for(int i=1;i<=n+n;++i)
    for(int j=0;j<=n;++j){
        f[i+1][j][0]=qm(f[i][j][0]+f[i][j][1]);
        if(!end[i])f[i+1][j+1][1]=f[i][j][0];
    }
    for(int i=0,t;i<=n;++i){
        t=1ll*fac[n-i]*qm(f[n+n][i][0]+f[n+n][i][1])%p;
        if(i&1)Ans=qm(Ans-t+p);
        else Ans=qm(Ans+t);
    }
    printf("%d\n",Ans);
    return 0;
}

原文地址:https://www.cnblogs.com/penth/p/10158684.html

时间: 2024-08-30 10:35:50

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

【agc005d】~K Perm Counting

题目大意 求有多少中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/

AGC 005D.~K Perm Counting(容斥 DP 二分图)

题目链接 \(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\)连

[LeetCode 题解]: Merge k Sorted Lists

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 题意:对k个有序的链表进行归并排序.并分析其复杂度. /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(N

题解——UVA11997 K Smallest Sums

题面 背景 输入 输出 翻译(渣自翻) 给定K个包含K个数字的表,要求将其能产生的\( k^{k} \)个值中最小的K个输出出来 题解 k路归并问题的经典问题 可以转化为二路归并问题求解 考虑A[],B[]两个有序数组 使用堆,记录一些二元组\( (x,y) \),x表示值,y表示对应的b的下标,因为我们是把b合并到a上,所以我们能够根据记录的下标推出后面的值 然后两两合并 所以就很简单 放代码 #include <cstdio> #include <algorithm> #inc

leecode 题解 || Merge k Sorted Lists 问题

problem: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. Tags Divide and Conquer Linked List Heap 合并K个已序单链表 thinking: (1)题目没有要求不能够新开ListNode,所以暴力破解法:提取K个list的keyword.排序.新建结点插入.这样的情况对原list是否排好序没有要求. 排

题解CF1133E K Balanced Teams

题目:CF1133E K Balanced Teams 拿到手第一想法就是算一下每个人可以和他分一起的,然后贪心.很显然在1s内被自己hack.所以贪心不行优先考虑dp.看到n和k的范围明显是个O(n^2)的dp. 由于我们不考虑顺序,按常规把水平排个序. 我的最初想法: 设f[i][j]:前i个人分了j组的最大和. 1.h[i]-h[lst]<=5 我们可以把他分到j-1组也可以分到第j组 2.h[i]-h[lst]>5 只能把i分到第j组 但我们遇到一个问题,就是我们不清楚第j-1组的开头

内部考试总结

2019年8月5日星期一 Kos 题目描述 有\(n\)个人,他们之间将会有\(m\)场比赛(两个人之间可能有多场比赛,但这些比赛的结果不一定完全相同),问获胜场次最多的人获胜的场次数最少 限制范围 \(Time:1000ms\quad Space:512MB\) \(1\le n\le 10^4,0\le m\le 10^4\) 正解算法 建立二分答案,对猜测解\(x\),考虑建立最大流模型 对每场比赛和每个人都建立一个点,从源点向每场比赛连一条容量为\(1\)的边,每个选手向汇点连一条容量为

AGC005做题小记

比赛链接:AGC005 C. Tree Restoring 题意 给出树上每个节点到其它节点的最远距离,问是否可能. $ n ≤ 100 $ . 题解 离一个点最远的节点是直径两端点之一. 先把直径上的点切出来.剩余的点判断一下是不是在 $ \lceil \frac{d}{2} \rceil +1 $ 和 $ d + 1 $ 之间即可. My Submission D. ~K Perm Counting 题意 计数 $ n $ 个数全排列个数,使得 $ abs(a_i - i) ≠ K $ $

2019.12.27日志

上午去学校上(shui)课(jiao) 下午跟几位神仙去补(bei)课(da) 晚上不想去学校学OI,在家颓了2小时知乎,然后日常觉得这样下去不行,开始想办法提高自己 然后想到了写博客,写日志,然后重新捡起了两个很久没用的博客,花了1小时复习了一下markdown,并且选了一下比较好看的格式,然后开始 做题(×),看题解(√) 看了大概四题的题解就睡了 今日小结: 颓废 2小时 做题 0题 看题解 4题 IIIDX 画作 ~K Perm Counting 折射 原文地址:https://www.