HELP
查看原帖
HELP
300313
_luanyi_楼主2021/7/15 15:12

样例过了,但只有20分,其余全WA

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, m, k[10], p[10];
int xs[10];
int pow (int a, int b) {
	if (b == 0) return 1;
	int tmp = pow (a, b / 2);
	tmp *= tmp;
	if (b & 1) tmp *= a;
	return tmp;
}
int calc (int beg, int end) {
	int ans = 0;
	for (int i = beg; i <= end; i++) ans += k[i] * pow (xs[i], p[i]);
	return ans;
}
int s[10000000];
int num[10000000], cnt[10000000], l;
int cntans;
void findans (int tmp) {
	int ip = lower_bound (num + 1, num + l + 1, tmp) - num;
	if (num[ip] == tmp) cntans += cnt[ip];
}
void dfs1 (int id) {
	if (id == (n >> 1) + 1) s[++s[0]] = calc (1, n >> 1);
	else for (int i = 1; i <= m; i++) xs[id] = i, dfs1 (id + 1);
}
void dfs2 (int id) {
	if (id == n + 1) findans (calc ((n >> 1) + 1, n));
	else for (int i = 1; i <= m; i++) xs[id] = i, dfs2 (id + 1);
}
signed main () {
	cin >> n >> m;
	for (int i = 1; i <= n; i++) cin >> k[i] >> p[i];
	dfs1 (1);
	sort (s + 1, s + s[0] + 1);
	num[1] = s[1];
	cnt[1] = 1;
	l = 1;
	for (int i = 2; i <= s[0]; i++)
		if (num[l] == s[i]) ++cnt[l];
		else {
			num[++l] = s[i];
			cnt[l] = 1;
		}
	dfs2 ((n >> 1) + 1);
	cout << cntans;
	return 0;
}
2021/7/15 15:12
加载中...