[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 Input

Sample Input 1

3 1

Sample Input 2

4 1

Sample Input 3

4 2

Sample Input 4

4 3

Sample Input 5

425 48

Sample Output

Sample Output 1

2

Sample Output 2

5

Sample Output 3

9

Sample Output 4

14

Sample Output 5

756765083

HINT

对于第一组样例,有2个排列 (1,2,3), (3,2,1) 是不糟糕的。对于第二组样例,有5个排列 (1,2,3,4), (1,4,3,2), (3,2,1,4), (3,4,1,2), (4,2,3,1) 是不糟糕的。本题采用subtask。存在10%的数据,满足n≤5;存在50%的数据,满足n≤300。

试题分析

我们发现一个数可否放在一个位置上只与这个数和位置有关,那么我们考虑哪些关系不能摆放,显然是:$$(pos_1)\rightarrow (num_{K+1}) \rightarrow (pos_{2K+1}) \ldots$$

然后我们会发现,这些2N个点组成了\((K-1)\times 2\)条链,所以考虑去计算这些链。

我们显然不能选链上的边,但是剩下的情况又不好考虑,所以我们考虑容斥。

设\(g_i\)表示选链上至少i条边的情况数,那么最后\(g_i=g_i\times (n-k)!\),然后普通容斥。

到这里,我们就可以设\(f_{i,j,0/1}\)表示前i个元素,选了j条边,当前边有没有选。

然后容斥一下,将所有连强行拼起来并且标记拼的那条边不可以选然后dp即可。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<algorithm> using namespace std;
#define LL long long inline LL read(){
LL x=0,f=1; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
const LL INF = 2147483600;
const LL MAXN = 2010;
const LL Mod = 924844033; LL f[MAXN*2][MAXN*2][2];
LL g[MAXN*2]; LL N,K; bool fg[MAXN*2];
LL ans; LL cnt; LL fac[MAXN*2]; int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
N=read(),K=read();
for(LL i=1;i<=K;i++){
for(LL j=i;j<=N;j+=K) fg[++cnt]=(j==i);
for(LL j=i;j<=N;j+=K) fg[++cnt]=(j==i);
}
f[0][0][0]=1;
for(LL i=0;i<2*N;i++){
for(LL j=0;j<=i;j++){
f[i+1][j][0]=(f[i][j][0]+f[i][j][1])%Mod;
if(!fg[i+1]) f[i+1][j+1][1]=f[i][j][0];
}
} fac[0]=1;
for(LL i=1;i<=N;i++) fac[i]=fac[i-1]*i%Mod;
for(LL i=0;i<=N;i++){
LL ret=(f[2*N][i][0]+f[2*N][i][1])%Mod;
ans+=(i&1?-1:1)*ret*fac[N-i]%Mod; ans=(ans%Mod+Mod)%Mod;
} printf("%lld\n",ans);
return 0;
}

[Agc005D]K Perm Counting的更多相关文章

  1. [AGC005D] ~K Perm Counting [dp]

    题面 传送门 思路 首先可以明确的一点是,本题中出现不满足条件的所有的数,都是分组的 只有模$K$意义下相同的数之间才会出现不满足条件的情况,而且仅出现在相邻的情况 那么我们考虑把这个性质利用起来 我 ...

  2. AGC 005 D - ~K Perm Counting

    D - ~K Perm Counting 链接 题意: 求有多少排列对于每个位置i都满足$|ai−i|!=k$.n<=2000 分析: 容斥+dp. $answer = \sum\limits_ ...

  3. 【agc005d】~K Perm Counting

    题目大意 求有多少中1~n的排列,使得\(abs(第i个位置的值-i)!=k\) 解题思路 考虑容斥,\(ans=\sum_{i=0}^{n}(-1)^ig[i](n-i)!(g[i]表示至少有i个位 ...

  4. [AT2062] ~K Perm Counting

    AT2602 , Luogu 求对于 \(n\) 个数的排列 , 有多少种方案满足对于所有的 \(i\) , \(|P_i - i| != K\) , 答案对 \(924844033\) 取模 . \ ...

  5. 题解-Atcoder_agc005D ~K Perm Counting

    Problem AtCoder-agc005D 题意概要:给出\(n,k\),求合法的排列个数,其中合法定义为任何数字所在位置与自身值差的绝对值不为\(k\)(即求排列\(\{A_i\}\),使得\( ...

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

    题目链接 \(Description\) 给定\(n,k\),求 满足对于所有\(i\),\(|a_i-i|\neq k\)的排列的个数. \(2\leq n\leq 2000,\quad 1\leq ...

  7. 做题记录 To 2019.2.13

    2019-01-18 4543: [POI2014]Hotel加强版:长链剖分+树形dp. 3653: 谈笑风生:dfs序+主席树. POJ 3678 Katu Puzzle:2-sat问题,给n个变 ...

  8. AtCoder Grand Contest 005

    AtCoder Grand Contest 005 A - STring 翻译 给定一个只包含\(ST\)的字符串,如果出现了连续的\(ST\),就把他删去,然后所有位置前移.问最后剩下的串长. 题解 ...

  9. RE:从零开始的AGC被虐(到)生活(不能自理)

    RE:从零开始的AGC被虐(到)生活(不能自理) 「一直注视着你,似近似远,总是触碰不到.」 --来自风平浪静的明天 AtCoder Grand Contest 001 B: Mysterious L ...

随机推荐

  1. UML和模式应用5:细化阶段(8)---逻辑架构和UML包图

    1.前言 本章是从面向分析的工作过度到软件设计 典型的OO系统设计的基础是若干架构层,如UI层.应用逻辑(领域)层 本章简要考察逻辑分层架构和相关UML表示法 2.逻辑架构和层 逻辑架构 逻辑架构是软 ...

  2. jdk8系列一、jdk8 Lamda表达式语法、接口的默认方法和静态方法、supplier用法

    一.简介 毫无疑问,Java 8是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和JVM等方面的十多个新特性. 在本文中我们将学习这些新特性,并用实际 ...

  3. __ATTRIBUTE__ 知多少?

    GNU C 的一大特色就是__attribute__ 机制.__attribute__ 可以设置函数属性(Function Attribute ).变量属性(Variable Attribute )和 ...

  4. sublime汉化步骤记录

    1.下载sublime编辑器,下载地址:http://www.sublimetext.com/ 2.安装sublime 3.首先安装“Package Control”(如果已经安装过可以跳过此步骤) ...

  5. zabbix系列(十)zabbix添加对zookeeper集群的监控

    1.应用场景描述 在目前公司的业务中,有部分ESB架构用ZooKeeper作为协同服务的场景,做好ZooKeeper的监控很重要. 2.ZooKeeper监控要点 系统监控 内存使用量    ZooK ...

  6. zabbix系列(六)zabbix添加对ubuntu系统的监控

    在ubuntu os上安装agent,使用如下命令: wget http://mirrors.aliyun.com/zabbix/zabbix/3.0/ubuntu/pool/main/z/zabbi ...

  7. 罗克韦尔 Allen-Bradley MicroLogix 1400 查看、设置IP

    =============================================== 2019/4/14_第1次修改                       ccb_warlock == ...

  8. NodeJs>------->>第一章:Node.js介绍

    一:章节前言 二:Node.js概述 1:使用node.js能够解决什么问题 2:实现高性能服务器 3:非阻塞型I/O及事件环形机制 4:node.js适合开发的程序 三:node.js安装 一.No ...

  9. UVA101 【The Blocks Problem】

    一个大模拟!!! 总的来说就是碰到move就要把a上面的全部放回原处. 如果碰到onto就要把b上面的全部放到原处. 因为move是只移动a一个,所以a上面的要归位,而pile是移一堆,所以不用. o ...

  10. Inno Setup 系列之安装、卸载前检测进程运行情况并关闭相应进程

    需求 最近用 Inno Setup 做一个exe,可是在安装之前要停止正在运行的相应进程或者在卸载之前要停止正在运行的相应进程,可是发现它自身的方法不能满足要求,最后经过度娘的耐心帮助下终于在网上找到 ...