没错,全世界都\(\mathrm{AK}\)了。算法
这题不难。直接严格分一下类,看看\(k\)我的、\(k+1\)我的、\(k+2\)我的都错开的方案数便可。spa
很裸的容斥原理题啊。get
惟一的坑点就是在处理\(\mathrm{lcm}\)的时候,若是\(\mathrm{lcm}\)已经超过了上界\(\mathrm{R}\),就应该直接退出,否则会溢出。ast
\(\mathrm{T3}\)class
十 年 O I 一 场 空 , 不 看 题 意 见 祖 宗 。原理
看清题意以后其实也不难啊。二进制
对于每组数据,预处理出\(\mathrm{f[i][j]}\)表示在\(i\)个数位中凑出和为\(j\)的数字的方案数,时间复杂度是\(\Theta (n^2k^2)\)的,毫无压力、
而后回到题意,先算出 前\(n\)个数字的总和等于最后\(n\)个数字的总和的方案数 和 下标是奇数的全部数字的总和等于下标是偶数的全部数字的总和 的方案数的和,再减去同时知足这两种规则的方案数便可。
连题都不看清楚,果真能够退役。
这题刷新了我程序的细节方面的上限了……
不过自己的算法并不难,就是直接枚举\(k\)个字符串“压”在一块儿,而后“压”好的字符串(假设这个字符串存在)有多少种多是能够直接算出来的。
但题目要求了构造出的字符串只能匹配\(k\)个字符串,因此咱们还要再看看构造出的这些可能的字符串中有哪些是和剩下\(n-k\)个字符串是可以匹配的,可是由于一个构造出的字符串可能和多个字符串匹配,因此咱们还要再容斥一下。
因此就是 \(01\)二进制枚举(也能够用\(\mathrm{DFS}\)实现)+容斥原理,虽然细节巨多,但总比扮演方案这种题目要简单。
被思惟定式带到了容斥原理了,结果比赛完一想才发觉简单得要死……
用\(\mathrm{f[i][j]}\)表示 当前放了数字的位置的二进制状态为\(i\),且最后一个放进去的数为\(a[j]\)的方案数。而后就直接枚举\(a[j]\)可以放进\(i\)中的哪一位便可。
可是最终的答案不是\(\mathrm{f[(1<<n)-1][n]}\),由于整个数组中确定会有重复的元素,这个时候就要像求可重集排列同样把这些多余元素的全排列的积除掉。