30pts 疑似取模不规范,求条
查看原帖
30pts 疑似取模不规范,求条
1038334
wth2026楼主2024/8/29 19:23
#include <cstring>
#include <iostream>
#include <algorithm>

#define endl '\n'
#define int long long
#define inf 0x3f3f3f3f
#define lnf 0x3f3f3f3f3f3f3f3f

const bool Debug = false;

#define Debug true

using namespace std;

const int N = 500;

void init ();

int n, p;
int f[N + 5][N + 5][3] = {}, _Ans = 0;
int _Prm[9] = {0, 2, 3, 5, 7, 11, 13, 17, 19};

class Node {
	private :
	
	protected :
		
	public :
		int _Vl, _Pr, _S;
		
		bool operator < (const Node _Oper) {
			return _Pr < _Oper._Pr;
		}
		
		void Do () {
			int _ = _Vl;
			_Pr = -1;
			_S = 0;
			
			for (register int i = 1; i <= 8; ++ i) {
				if (_ % _Prm[i]) {
					continue ;
				}
				
				_S |= (1 << (i - 1));
				
				while (! (_ % _Prm[i])) {
					_ /= _Prm[i];
				}
			}
			
			if (_ - 1) {
				_Pr = _;
			}
		}
	
} a[N + 5];

signed main () {
	init ();
	cin >> n >> p;
	
	for (register int i = 2; i <= n; ++ i) {
		a[i - 1]._Vl = i;
		a[i - 1].Do ();
	}
	
	sort (a + 1, a + n);
	f[0][0][0] = 1;
	
	for (register int i = 1; n - i; ++ i) {
		if (! (i - 1) || (a[i]._Pr - a[i - 1]._Pr) || ! (a[i]._Pr + 1)) {
			for (register int i = 0; i < N; ++ i) {
				for (register int j = 0; j < N; ++ j) {
					f[i][j][1] = f[i][j][2] = f[i][j][0];
				}
			}
		}
		
		for (register int j = 255; j + 1; -- j) {
			for (register int k = 255; k + 1; -- k) {
				if (j & k) {
					continue ;
				}
				
				if (! (a[i]._S & j)) {
					f[j][k | a[i]._S][2] = (f[j][k | a[i]._S][2] + f[j][k][2]) % p;
				}
				
				if (! (a[i]._S & k)) {
					f[j | a[i]._S][k][1] = (f[j | a[i]._S][k][1] + f[j][k][1]) % p;
				}
			}
		}
		
		if (! (n - i - 1) || (a[i]._Pr - a[i - 1]._Pr) || ! (a[i]._Pr + 1)) {
			for (register int j = 0; 256 - j; ++ j) {
				for (register int k = 0; 256 - k; ++ k) {
					if (j & k) {
						continue ;
					}
					
					f[j][k][0] = (f[j][k][1] + f[j][k][2] - f[j][k][0] + p) % p;
					
					if (Debug) {
						cout << f[j][k][0] << endl;
					}
				}
			}
		}
	}
	
	for (register int i = 0; 256 - i; ++ i) {
		for (register int j = 0; 256 - j; ++ j) {
			if (i & j) {
				continue ;
			}
			
			_Ans = (_Ans + f[i][j][0]) % p;
			
			if (Debug) {
				cout << _Ans << endl;
			}
		}
	}
	
	cout << _Ans << endl;
	
	return 0;
}

void init () {
	ios :: sync_with_stdio (false);
	cin.tie (0);
	cout.tie (0);
}
2024/8/29 19:23
加载中...