我们定义第一个集合为a, 第二个集合为b
先把a数组排序, 然后我们会以线段的形式得到b集合。
我们先用a[ 1 ]去和 b 中的元素结合, 只有size(a) 个数字未被覆盖, 我们从这些数组中选答案。
枚举这些数字, 什么情况下才它是答案呢, 就是移到a[ 2 ], a[ 3 ], a[ 4 ], 它都是未被覆盖的数组,
这个东西可以用hash值维护一下就能O(1)check啦。
#include<bits/stdc++.h>
#define LL long long
#define LD long double
#define ull unsigned long long
#define fi first
#define se second
#define mk make_pair
#define PLL pair<LL, LL>
#define PLI pair<LL, int>
#define PII pair<int, int>
#define SZ(x) ((int)x.size())
#define ALL(x) (x).begin(), (x).end() using namespace std; const int N = 4e5 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + ;
const double eps = 1e-;
const double PI = acos(-); template<class T, class S> inline void add(T& a, S b) {a += b; if(a >= mod) a -= mod;}
template<class T, class S> inline void sub(T& a, S b) {a -= b; if(a < ) a += mod;}
template<class T, class S> inline bool chkmax(T& a, S b) {return a < b ? a = b, true : false;}
template<class T, class S> inline bool chkmin(T& a, S b) {return a > b ? a = b, true : false;} int n, m, a[N];
vector<PII> seg;
vector<int> vc;
vector<int> ans; ull HashVal; ull hs[N], Pow[N]; ull getHash(int L, int R) {
return hs[R] - hs[L - ] * Pow[R - L + ];
} int main() {
for(int i = Pow[] = ; i < N; i++) Pow[i] = Pow[i - ] * ;
scanf("%d%d", &n, &m);
if(n == || n == m) return puts(""), ;
for(int i = ; i <= n; i++) scanf("%d", &a[i]);
sort(a + , a + + n);
a[n + ] = m;
a[] = -;
for(int i = ; i <= n; i++)
if(a[i] + < a[i + ])
seg.push_back(mk(a[i] + , a[i + ] - ));
seg.push_back(mk(-, -));
seg.push_back(mk(m, m));
sort(ALL(seg));
for(int i = ; i < SZ(seg) - ; i++)
for(int j = seg[i].se + ; j < seg[i + ].fi; j++)
vc.push_back((j + a[]) % m), vc.push_back((j + a[]) % m - m);
sort(ALL(vc));
for(int i = n - ; i >= ; i--) HashVal *= , HashVal += a[i + ] - a[i];
n--;
for(int i = ; i < SZ(vc); i++) hs[i] = hs[i - ] * + vc[i] - vc[i - ];
for(int i = SZ(vc) / ; i < SZ(vc); i++)
if(getHash(i - n + , i) == HashVal) ans.push_back(vc[i]);
printf("%d\n", SZ(ans));
for(auto& t : ans) printf("%d ", t);
if(SZ(ans))puts("");
return ;
} /*
*/