da an
2026-10-12 18:13:13
发布于:浙江
#include <bits/stdc++.h>
#define Gc() getchar()
#define Me(x,y) memset(x,y,sizeof(x))
#define Mc(x,y) memcpy(x,y,sizeof(x))
#define d(x,y) ((m)*(x-1)+(y))
#define R(n) (rnd()%(n)+1)
#define Pc(x) putchar(x)
#define LB lower_bound
#define UB upper_bound
#define fi first
#define se second
#define eb emplace_back
#define all(x) x.begin(),x.end()
using namespace std;
using ll = long long;
using db = double;
using lb = long db;
using ui = unsigned;
using ull = unsigned long long;
using pii = pair<int, int>;
const int N = 1e7 + 5, M = 300 + 5, K = 1000 + 5, mod = 998244353, Mod = mod - 1;
const db eps = 1e-9;
const int INF = 1e9 + 7;
mt19937 rnd(28382);
#define Tp template<typename T>
#define Ts template<typename T,typename... Ar>
namespace Debug {
Tp void _debug(char *f, T t) {
cerr << f << '=' << t << endl;
}
Ts void _debug(char *f, T x, Ar... y) {
while (*f != ',')
cerr << *f++;
cerr << '=' << x << ",";
_debug(f + 1, y...);
}
#ifdef LOCAL
#define gdb(...) _debug((char*)#VA_ARGS,VA_ARGS)
#else
#define gdb(...) void()
#endif
} using namespace Debug;
int n, P;
ll frc[N], f[N], g[N][3];
void Solve() {
scanf("%d%d", &n, &P);
for (int i = frc[0] = 1; i <= n + 1; i++)
frc[i] = frc[i - 1] * i % P;
f[0] = 1;
for (int i = 2; i <= n + 1; i++)
f[i] = (f[i - 1] + f[i - 2]) * (i - 1) % P;
g[0][2] = 1;
for (int i = 1; i * 2 <= n + 1; i++) {
if (i ^ 1) {
g[i][0] = (g[i - 1][1] * (2 * i - 3) + g[i - 2][2] * 2 * (2 * i - 2)) % P;
}
g[i][1] = (g[i][0] + g[i - 1][1] * 2) * (2 * i) % P;
g[i][2] = (g[i][0] + g[i][1] + g[i][1] * 2 * i + g[i - 1][2] * 2 * (2 * i)) % P;
}
ll ans = 0;
for (int i = 1; i <= n; i++)
ans ^= (frc[i] + 2 * (P - f[i]) + g[i >> 1][i & 1]) % P,
gdb((frc[i] + 2 * (P - f[i]) + g[i >> 1][i & 1]) % P);
printf("%lld\n", ans);
}
int main() {
int t = 1;
while (t--)
Solve();
cerr << clock() * 1.0 / CLOCKS_PER_SEC << '\n';
}
这里空空如也







有帮助,赞一个