#include <bits/stdc++.h>
using namespace std;
const int N = 1024, p[] = {0, 2, 3, 5, 7, 11, 13, 17, 19, 0};
struct node {
int S, p;
bool operator < (const node& x) const {
return p < x.p;
}
} a[N];
int n, m, ans, cnt, mod, dp[N][N], f1[N][N], f2[N][N];
int main() {
cin >> n >> mod, dp[0][0] = 1;
for (int i = 2; i <= n; i ++) {
int k = i;
for (int j = 1; j <= 8; j ++) {
if (k % p[j]) continue;
while (k % p[j] == 0) k /= p[j];
a[i].S |= 1 << (j - 1);
}
if (k != 1) a[i].p = k;
}
sort(a + 2, a + 1 + n);
for (int i = 2; i <= n; i ++) {
if (!a[i].p || a[i].p != a[i - 1].p) {
memcpy(f1, dp, sizeof dp);
memcpy(f2, dp, sizeof dp);
}
for (int j = 255; j >= 0; j --)
for (int k = 255; k >= 0; k --)
if (!(j & k) && !(k & a[i].S)) (f1[j | a[i].S][k] += f1[j][k]) %= mod;
for (int j = 255; j >= 0; j --)
for (int k = 255; k >= 0; k --)
if (!(j & k) && !(j & a[i].S)) (f2[j][k | a[i].S] += f2[j][k]) %= mod;
if (a[i].p && a[i + 1].p == a[i].p) continue; // ????
for (int j = 0; j <= 255; j ++)
for (int k = 0; k <= 255; k ++)
if (!(j & k)) dp[j][k] = ((f1[j][k] + f2[j][k]) % mod - dp[j][k] + mod) % mod;
}
for (int i = 0; i <= 255; i ++)
for (int j = 0; j <= 255; j ++)
if (!(i & j)) ans += dp[i][j], ans %= mod;
cout << ans << '\n';
return 0;
}
为什么注释那行删掉就过不了(n≤45 可以正常过,n≥46 过不了)?