首页 > 其他分享 >AGC005D ~K Perm Counting

AGC005D ~K Perm Counting

时间:2024-05-09 13:47:57浏览次数:23  
标签:head AGC005D int 链头 Perm vis le Counting id

Statement:

若一个有 \(n\) 个元素的排列 \(P\) 满足对于任意 \(i(1\le n \le n)\) 都有 \(|P_i - i| \ne k\),则这个排列是合法的。现给定 \(n, k\), 问有多少个合法的排列。

Solution:

神仙题啊。

考虑容斥。钦定有 \(i\) 个位置不满足条件,即满足 \(|P_i - i| = k\)。

这里有一步关键的转化:我们将每个下标以及元素的值分别看成一个个点,将满足 \(|P_i - i| = k\) 的点连边,组成一个二分图。

如下图:(机房画不了图就偷了一张)(\(k = 1, n = 5\))
image

像这样的左部点代表的是 \(P\) 中的元素,右部点代表的是位置。此时问题转化为在这张二分图上找出 \(i\) 条没有公共端点的边的方案数。注意到这个图由一条条互不相交的链组成,如果只有一条链,我们可以直接考虑 \(\rm dp\) 算。实际上,即使有多条链,我们依然可以把他们接在一起组成一条链,只是每条原链的链头不能向它的前驱连边。

于是令 \(f_{i,j,0/1}\) 为考虑链上前 \(i\) 个节点,选了 \(j\) 条互不相交的边,并且选/不选 \(i\) 与它的前驱的边。

显然有:

\[f_{i,j,0} = f_{i - 1, j, 0} + f_{i - 1, j, 1} \]

\[f_{i,j,1} = f_{i - 1, j - 1, 0} (head[i] = 0 且 j \ne 0) \]

其中 \(head[i] = 1/0\) 为 \(i\) 是/否为原图中某一条链的链头。

最后容斥回来就可以了。

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define id (x + n * pos)
using namespace std;

const int N = 2000 + 10, mod = 924844033;

int n, k, f[2 * N][N][2], tcnt, jc[N];

bool vis[N * 2], head[N * 2];

void dfs(int x, int pos){
	if(x > n || vis[id]) return; vis[id] = true;
//	cout << x << " " << pos << "\n";
	tcnt++; dfs(x + k, pos ^ 1);
}

signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin >> n >> k; jc[0] = 1;
	for(int i = 1; i <= n; i++){
		if(!vis[i]) head[tcnt + 1] = true, dfs(i, 0);
		if(!vis[i + n]) head[tcnt + 1] = true, dfs(i, 1);
		jc[i] = (jc[i - 1] * i) % mod;
	} 
	f[1][0][0] = 1;
	for(int i = 2; i <= tcnt; i++){
		for(int j = 0; j <= n; j++){
			f[i][j][0] = (f[i - 1][j][0] + f[i - 1][j][1]) % mod;
			if((!head[i]) && j) f[i][j][1] = f[i - 1][j - 1][0];
//			cout << i << " " << j << " " << f[i][j][0] << " " << f[i][j][1] << "\n";
		}
	}
	int ans = 0;
	for(int i = 0; i <= n; i++) ans = (ans + ((i & 1) ? -1 : 1) * (((f[2 * n][i][0] + f[2 * n][i][1]) % mod) * jc[n - i]) % mod + mod) % mod;
	cout << ans;
	
	return 0;
} 

标签:head,AGC005D,int,链头,Perm,vis,le,Counting,id
From: https://www.cnblogs.com/little-corn/p/18181966

相关文章

  • Over-Permission-基于Pikachu的学习
    越权漏洞原理该漏洞是指应用在检查授权时存在纰漏,使得攻击者在获得低权限用户账户后,利用一些方式绕过权限检查,访问或者操作其他用户或者更高权限。越权漏洞的成因主要是因为开发人员在对数据进行增、删、改、查询时对客户端请求的数据过分相信而遗漏了权限的判定,一旦权限验证不......
  • SSH远程连接时报错提示Permission denied (publickey).的解决方法
    1.发现问题在Linux终端使用sshroot@server_ip来连接到远程服务器时,出现Permissiondenied(publickey).提示2.分析问题远程主机禁用了ssh密码登录权限本地访问远程主机的公钥没有添加或者被取消(无法认证)本地生成的一对秘钥,私钥~/.ssh/id_rsa和公钥~/.ssh/id_rsa.pub。......
  • qoj1138 Counting Mushrooms
    交互题。有一个隐藏的01序列\(a\),你只知道\(a\)的长度,并记为\(n\)。保证\(a_1=0\)。你可以执行以下操作:询问一个序列\(b\),满足两两不同且长度在\([2,1000]\)之间。交互库会返回\(\sum[a(b_i)\not=a(b_{i+1})]\)。请在\(226\)次操作内求出\(a\)中\(0\)......
  • C. Game on Permutation
    链接:https://codeforces.com/problemset/problem/1860/C洛谷链接:https://www.luogu.com.cn/problem/CF1860C相关知识点复习:LIS最长上升子序列链接:https://blog.csdn.net/lxt_Lucia/article/details/81206439关键:这题的思路在于找到LIS长度为2的点,比如13254那么显然3,2是......
  • 在Docker内部使用gdb调试器报错-Operation not permitted
    在docker内部使用gdb调试时刻遇到了gdb如下报错信息:warning:Errordisablingaddressspacerandomization:Operationnotpermitted原因地址随机化是linux一项安全特性,它允许内核进程启动每次加载库的时候都在随机化的分布在进程虚拟内存地址空间上(早期固定的库要加载......
  • Codeforces 452F Permutation
    对于\(a,b,\frac{a+b}{2}\)肯定是需要固定下一些变量来考虑的。考虑固定下\(c=\frac{a+b}{2}\),考虑\(a,b\)。那么这样的\(a,b\)肯定满足\(a-c=b-c,a\not=b\),那么以\(c\)为中心,\(a,b\)就是对称的。用\(s_i=0,1\)来表示\(i\)是在\(c\)的......
  • 解决vscode连接远程服务器出现Bad owner or permissions on C:\\Users\\Administr
    1.找到.ssh文件夹。它通常位于C:\Users2.右键单击.ssh文件夹,然后单击“属性”,选择“安全”3.单击“高级”。单击“禁用继承”,单击“确定”。将出现警告弹出窗口。单击“从此对象中删除所有继承的权限”。4.此时所有用户都将被删除。添加所有者。在同一窗口中,单击“编辑”按......
  • 在.npmrc中 unsafe-perm = true package-lock=false的作用
    在.npmrc配置文件中,unsafe-perm和package-lock的设置有各自的作用:unsafe-perm=true:此设置影响npm(或pnpm,如果使用该包管理器)在执行包脚本时的行为。默认情况下,当以root或具有管理员权限的用户身份运行npm安装命令时,npm会限制包脚本中的权限,避免以root身份执......
  • permutations and combinations in js All In One
    permutationsandcombinationsinjsAllInOnejs中的排列组合概念排列组合demos/*permutations&combinations排列&组合https://leetcode.com/problems/3sum/给定一个数字数组,找出有三个元素为一组构成的所有不重复的子数字数组!*///constarr=[1,2,......
  • Intel Pentium III CPU(Coppermine, Tualatin) L2 Cache Latency, Hardware Prefetch
    这几天,偶然的机会想到了困扰自己和其他网友多年的IntelPentiumIII系列处理器缓存延迟(L2CacheLatency),以及图拉丁核心版本是否支持硬件预取(HardwarePrefetch)问题。手头的支持图拉丁核心处理器的i815主板还在正常服役中,铜矿和图拉丁核心处理器也都有,所以就专门做了这一期调查,感......