萌新DP挂了求助啊()()(luogu2150)
查看原帖
萌新DP挂了求助啊()()(luogu2150)
139012
wrpwrp楼主2020/10/15 21:44

前面的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;
}
2020/10/15 21:44
加载中...