QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#66906#5169. 夹娃娃10circleCompile Error//C++144.6kb2022-12-09 12:29:522022-12-09 12:30:01

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-12-09 12:30:01]
  • 评测
  • [2022-12-09 12:29:52]
  • 提交

answer


// 哈哈,不认识“娃”这个字了。

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef vector<int> vint;

int read() {
	int a = 0, b = 0; char c = getchar();
	while (c < '0' || c > '9') b ^= (c == '-'), c = getchar();
	while (c >= '0' && c <= '9') a = a * 10 - 48 + c, c = getchar();
	return b ? -a : a;
}

const int N = 15, V = 1024 << 1, Vp = 521;
const int mod = 998244353, G = 3, iG = 332748118;
int n, q, f[N][V], vf[N][Vp][V];
void Add(int &a, int b) { if ((a += b) >= mod) a -= mod; }
void Sub(int &a, int b) { if ((a -= b) < 0) a += mod; }
int add(int a, int b) { return (a + b >= mod) ? a + b - mod : a + b; }
int sub(int a, int b) { return a - b < 0 ? a - b + mod : a - b; }
void Fav(int &a, int b, int c) { a = (a + (ll)b * c) % mod; }
void Mul(int &a, int b) { a = (ll)a * b % mod; }
int mul(int a, int b) { return (ll)a * b % mod; }
int pw(ll a, int k) { ll s = 1; while (k) { if (k & 1) s = s * a % mod; a = a * a % mod; k >>= 1; } return s; }

int rv[V];

void init() {
	for (int i = 1; i < V; ++i) rv[i] = (rv[i >> 1] >> 1) | ((i & 1) ? (V >> 1) : 0);
}


void NTT(int f[], int ag = 1) {
	for (int i = 0; i < V; ++i) if (i < rv[i]) swap(f[i], f[rv[i]]);
	for (int k = 2; k <= V; k <<= 1) {
		int rk = k >> 1, w = pw(G, (mod - 1) / k);
		for (int i = 0; i < V; i += k) {
			int r = 1;
			for (int j = i; j < i + rk; ++j) {
				int g = mul(f[j + rk], r);
				f[j + rk] = sub(f[j], g);
				Add(f[j], g);
				
				Mul(r, w);
			}
		}
	}
	if (!ag) {
		int iV = pw(V, mod - 2);
		reverse(f + 1, f + V);
		for (int i = 0; i < V; ++i) Mul(f[i], iV);
	}
}



void mulp(int f[], int g[]) {
	static int h[V];
	memset(h, 0, sizeof h);
	for (int v1 = 0; v1 < V; ++v1) {
		for (int v2 = 0; v1 + v2 < V; ++v2) {
			Fav(h[v1 + v2], f[v1], g[v2]);
		}
	}
	for (int i = 0; i < V; ++i) cout << g[i] << ' '; cout << '\n';
	for (int i = 0; i < V; ++i) cout << f[i] << ' '; cout << '\n';
	for (int i = 0; i < V; ++i) cout << h[i] << ' '; cout << '\n';
	NTT(g);
	NTT(f);
	for (int i = 0; i < V; ++i) Mul(g[i], f[i]);
	NTT(g, 0);
	NTT(f, 0);
	for (int i = 0; i < V; ++i) cout << g[i] << ' '; cout << '\n';
	cout << '\n';
}

int F[128][521][V];

void pre() {
	
	for (int v = 0; v < (1 << n); ++v) {
		for (int k = 1; k <= 520; ++k) {
			if (v == 0) for (int o = 0; o < V; ++o) F[v][k][o] = 1;
			for (int nw = n - 1; nw >= 0; --nw) if (!((v >> nw) & 1)) {
				int u = v | (1 << nw);
				for (int o = 0; o < V; ++o) F[u][k][o] = mul(F[v][k][o], vf[nw][k][o]);
				
			} else break;
			NTT(F[v][k], 0);
		}
	}
}


void sol1() {
	static int a[N], b[N], c[N];
	for (int i = 0; i < n; ++i) a[i] = read(), b[i] = read(), c[i] = read();
	while (q--) {
		char s[20];
		int m, K;
		scanf("%s%d%d", s, &m, &K);
		static int f[Vp], g[Vp];
		memset(f, 0, sizeof f); memset(g, 0, sizeof g);
		f[0] = 1;
		for (int i = 0; i < n; ++i) {
			for (int k = 0; k < Vp; ++k) g[k] = add(f[k], (k >= b[i] ? g[k - b[i]] : 0));
			if (s[i] == '1') {
				int mc = K / b + bool(K % b);
				if (mc > c) {
					memset(f, 0, sizeof f);
					continue;
				}
				for (int k = 0; k < Vp; ++k) {
					f[k] = sub((k >= b[i] * mc ? g[k - b[i] * mc] : 0),
							 (k >= b[i] * (c[i] + 1) ? g[k - b[i] * (c[i] + 1)] : 0));
				}
			} else{
				for (int k = 0; k < Vp; ++k) f[k] = sub(g[k], (k >= b[i] * (c[i] + 1) ? g[k - b[i] * (c[i] + 1)] : 0));
			}
		}
		int ans = 0;
		for (int j = 0; j <= m; ++j) Add(ans, f[j]);
		cout << ans << '\n';
	}
	
	exit(0);
}

int main() {
//	freopen("a.in", "r", stdin);
//	freopen("a.out", "w", stdout);
	init();
	
	n = read(), q = read();
	read();
	if (n > 4) sol1();
	
	// mod = read();
	for (int i = 0; i < n; ++i) {
		int a = read();
		f[i][0] = 1;
		for (int r = 0; r < a; ++r) {
			int b = read(), c = read();
			static int g[V];
			for (int k = 0; k < Vp; ++k) g[k] = add(f[i][k], (k >= b ? g[k - b] : 0));
			for (int k = 0; k < Vp; ++k) f[i][k] = sub(g[k], (k >= b * (c + 1) ? g[k - b * (c + 1)] : 0));
		}
		memcpy(vf[i][0], f[i], V << 2);
		for (int k = 0; k < Vp - 1; ++k) {
			memcpy(vf[i][k + 1] + k + 1, vf[i][k] + k + 1, (V - k - 1) << 2);
			NTT(vf[i][k]);
		}
		NTT(vf[i][520]);
	}
	pre();
	for (int i = 0; i < q; ++i) {
		char s[20];
		int m, k, v = 0;
		scanf("%s%d%d", s, &m, &k);
		for (int j = 0; j < n; ++j) if (s[j] == '1') v |= 1 << j;
		int lw = k * __builtin_popcount(v);
		if (lw > m) {
			cout << 0 << '\n';
			continue;
		}
		
		int ans = 0;
		for (int j = 0; j <= m; ++j) Add(ans, F[v][k][j]);
		cout << ans << '\n';
	}
	return 0;
}

详细

answer.code: In function ‘void sol1()’:
answer.code:111:44: error: invalid operands of types ‘int’ and ‘int [15]’ to binary ‘operator/’
  111 |                                 int mc = K / b + bool(K % b);
      |                                          ~ ^ ~
      |                                          |   |
      |                                          int int [15]
answer.code:111:57: error: invalid operands of types ‘int’ and ‘int [15]’ to binary ‘operator%’
  111 |                                 int mc = K / b + bool(K % b);
      |                                                       ~ ^ ~
      |                                                       |   |
      |                                                       int int [15]
answer.code:112:40: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
  112 |                                 if (mc > c) {
      |                                     ~~~^~~
answer.code:104:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
  104 |                 scanf("%s%d%d", s, &m, &K);
      |                 ~~~~~^~~~~~~~~~~~~~~~~~~~~
answer.code: In function ‘int main()’:
answer.code:162:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
  162 |                 scanf("%s%d%d", s, &m, &k);
      |                 ~~~~~^~~~~~~~~~~~~~~~~~~~~