萌新过了,但是不理解
查看原帖
萌新过了,但是不理解
560516
喵仔牛奶楼主2022/11/20 17:35
#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;
}

为什么注释那行删掉就过不了(n45n\leq45 可以正常过,n46n\geq46 过不了)?

2022/11/20 17:35
加载中...