前面的dp是对的, 后面dp合并挂了()()
求大佬们帮忙啊艹
真不会了
蟹蟹您们了!!!!!
#include <cmath>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
#define R register
const int N = 500 + 5;
inline int read() {
int x = 0, f = 1; char a = getchar();
for(; a > '9' || a < '0'; a = getchar()) if(a == '-') f = -1;
for(; a >= '0' && a <= '9'; a = getchar()) x = x * 10 + a - '0';
return x * f;
}
int n, P;
int mp[30];
struct Num {
int State;
int Big;
inline void init(int x) {
for(R int i = 2; i * i <= x; i ++) {
if(x % i == 0) State |= (1 << mp[i]);
while(x % i == 0) x /= i;
}
if(x == 1) Big = 0;
else if(x < 23) Big = 0, State |= (1 << mp[x]);
else Big = x;
//cout << Big << endl;
}
}nm[N];
inline bool cmp(Num x, Num y) { return x.Big < y.Big; }
int f[2][1 << 8][1 << 8];
int g[2][2][1 << 8][1 << 8];
int main() {
#ifdef IN
freopen("a.in", "r", stdin);
//freopen(".out", "w", stdout);
#endif
n = read(); P = read();
mp[2] = 0; mp[3] = 1; mp[5] = 2; mp[7] = 3; mp[11] = 4;
mp[13] = 5; mp[17] = 6; mp[19] = 7;
for(R int i = 1; i < n; i ++) nm[i].init(i + 1);
sort(nm + 1, nm + n, cmp);
int las = 1, now = 1;
f[0][0][0] = 1;
int nw = 1, nx = 0;
for(R int i = 1; i < n; i ++)
if(nm[i].Big == 0) {
las = i;
swap(nw, nx);
memcpy(f[nx], f[nw], sizeof(f[nx]));
for(R int S1 = (1 << 8) - 1; ~ S1; S1 --)
for(R int S2 = (1 << 8) - 1; ~ S2; S2 --)
if((S1 & S2) == 0) {
if((nm[i].State & S2) == 0)
f[nx][S1 | nm[i].State][S2] = (f[nx][S1 | nm[i].State][S2] + f[nw][S1][S2]) % P;
if((nm[i].State & S1) == 0)
f[nx][S1][S2 | nm[i].State] = (f[nx][S1][S2 | nm[i].State] + f[nw][S1][S2]) % P;
}
}
las ++; now = las;
//cout << las << endl;
while(1) {
if(now > n - 1) break;
while(nm[now].Big == nm[las].Big && now < n) now ++;
now --;
swap(nw, nx);
memcpy(f[nx], f[nw], sizeof(f[nx]));
int Nw = 1, Nx = 0;
memcpy(g[0][0], f[nw], sizeof(f[nw]));
memcpy(g[0][1], f[nw], sizeof(f[nw]));
for(R int i = las; i <= now; i ++) {
swap(Nw, Nx);
memcpy(g[Nx][0], g[Nw][0], sizeof(g[Nw][0]));
memcpy(g[Nx][1], g[Nw][1], sizeof(g[Nw][1]));
for(R int S1 = (1 << 8) - 1; ~ S1; S1 --)
for(R int S2 = (1 << 8) - 1; ~ S2; S2 --)
if((S1 & S2) == 0) {
if((nm[i].State & S2 == 0))
g[Nx][0][S1 | nm[i].State][S2] =
(g[Nx][0][S1 | nm[i].State][S2] + g[Nw][0][S1][S2]) % P;
if((nm[i].State & S1 == 0))
g[Nx][1][S1][S2 | nm[i].State] =
(g[Nx][1][S1][S2 | nm[i].State] + g[Nw][1][S1][S2]) % P;
}
}
for(R int S1 = (1 << 8) - 1; ~ S1; S1 --)
for(R int S2 = (1 << 8) - 1; ~ S2; S2 --)
if((S1 & S2) == 0)
f[nx][S1][S2] = g[nx][0][S1][S2] + g[nx][1][S1][S2] - f[nw][S1][S2];
las = now + 1;
now ++;
}
int ans = 0;
for(R int S1 = (1 << 8) - 1; ~ S1; S1 --)
for(R int S2 = (1 << 8) - 1; ~ S2; S2 --)
if((S1 & S2) == 0) ans = (ans + f[nx][S1][S2]) % P;
printf("%d\n", ans);
return 0;
}