/** * author: longvu * created: 06/04/24 09:05:42 **/ #include using namespace std; #define int long long #define sz(x) ((int)x.size()) #define all(x) (x).begin(), (x).end() const int INF = numeric_limits::max(); const int nax = (int)(401001); const int mod = 1e9 + 7; template bool maximize(X& x, const Y y) { if (y > x) {x = y; return true;} return false; } template bool minimize(X& x, const Y y) { if (y < x) {x = y; return true;} return false; } namespace NTT { const int MOD = 998244353; const int root_pw = 1 << 23; int pw(int a, int n) { if (n == 0) return 1; int q = pw(a, n / 2); if (n % 2 == 0) return q * 1ll * q % MOD; return q * 1ll * q % MOD * a % MOD; } const int root = pw(3, MOD / root_pw); const int root_1 = pw(root, MOD - 2); void ntt(vector& a, bool inv) { int n = a.size(), j = 0; vector roots(n / 2); for (int i = 1; i < n; i++) { int bit = (n >> 1); while (j >= bit) { j -= bit; bit >>= 1; } j += bit; if (i < j) { swap(a[i], a[j]); } } int ang = inv ? root_1 : root; for (int i = n; i < root_pw; i *= 2) { ang = ang * 1ll * ang % MOD; } roots[0] = 1; for (int i = 1; i < n / 2; i++) { roots[i] = roots[i - 1] * 1ll * ang % MOD; } for (int i = 2; i <= n; i <<= 1) { int step = n / i; for (int j = 0; j < n; j += i) { for (int k = 0; k < i / 2; k++) { int u = a[j + k], v = a[j + k + i / 2] * 1ll * roots[step * k] % MOD; a[j + k] = (u + v) % MOD; a[j + k + i / 2] = (u - v + MOD) % MOD; } } } if (inv) { int n_inv = pw(n, MOD - 2); for (int i = 0; i < n; i++) { a[i] = a[i] * 1ll * n_inv % MOD; } } } vector multiply(const vector &a, const vector &b) { vector fa(a.begin(), a.end()), fb(b.begin(), b.end()); int n = 1; while (n < a.size() + b.size()) n <<= 1; fa.resize(n); fb.resize(n); ntt(fa, false); ntt(fb, false); for (int i = 0; i < n; i++) fa[i] = (long long)fa[i] * fb[i] % MOD; ntt(fa, true); return fa; } } int block_sz = 901; tuple a[nax]; int L[nax], R[nax], ans[nax]; int32_t main() { ios_base::sync_with_stdio(false); cin.tie(0); int n; cin >> n; for (int i = 0; i < n; ++i) { cin >> get<0>(a[i]); get<1>(a[i]) = i; get<2>(a[i]) = 1; } for (int i = n; i < 2 * n; ++i) { cin >> get<0>(a[i]); get<1>(a[i]) = i - n; get<2>(a[i]) = 2; } sort(a, a + 2 * n); int n_block = 0; for (int i = 0; i < 2 * n; i += block_sz) { L[++n_block] = i; R[n_block] = min(i + block_sz - 1, 2 * n - 1); } // for (int i = 0; i < 2 * n; ++i) { // cout << get<0>(a[i]) << " "; // } // cout << '\n'; for (int i = 1; i <= n_block; ++i) { for (int j = L[i]; j <= R[i]; ++j) { if (get<2>(a[j]) == 1) { for (int e = L[i]; e < j; ++e) { if (get<2>(a[e]) == 2) { ans[(get<1>(a[e]) - get<1>(a[j]) + n) % n]++; } } } } } vector f, g(n + 1, 0); for (int i = 1; i <= n_block; ++i) { // cout << L[i] << " " << R[i] << '\n'; f.clear(); f.resize(n + 1, 0); fill(all(f), 0); for (int j = L[i]; j <= R[i]; ++j) { if (get<2>(a[j]) == 1) { f[n - get<1>(a[j])]++; } } f = NTT::multiply(f, g); for (int j = - n; j <= n; ++j) { ans[(j + n) % n] += f[n + j]; } for (int j = L[i]; j <= R[i]; ++j) { if (get<2>(a[j]) == 2) { g[get<1>(a[j])]++; } } } // for (int i = 0; i < n; ++i) { // cout << ans[i] << " "; // } // cout << '\n'; vector anstr; for (int i = 0; i < n; ++i) { if (ans[i] >= n / 2 + 1) { anstr.push_back(i); } } cout << sz(anstr) << '\n'; for (auto z : anstr) { cout << z << " "; } cout << '\n'; return 0; }