奇怪的结果:WA on #4 but AC on #5
查看原帖
奇怪的结果:WA on #4 but AC on #5
521554
W1ngD1nGa5ter楼主2025/1/10 09:25

蒟蒻求调

#include <bits/stdc++.h>
using namespace std;
// 高精重载
struct bint
{
	vector<int> num;
	bint &clear_0()
	{
		while (!num.empty() && !num.back())
			num.pop_back();
		return *this;
	}
	bint() {}
	template <typename Tint>
	bint(Tint n)
	{
		while (n)
		{
			num.push_back(n % 10);
			n /= 10;
		}
	}
	template <typename Tint>
	bint operator*(const Tint &B) const
	{
		bint res(*this);
		auto as = num.size(), rs = as + 20;
		res.num.resize(rs);
		for (int i = 0; i < as; ++i)
			res.num[i] *= B;
		for (int i = 0; i < as; ++i)
			if (res.num[i] >= 10)
				res.num[i + 1] += res.num[i] / 10, res.num[i] %= 10;
		return res.clear_0();
	}
	// bint operator*(const bint &B) const
	// {
	// 	bint res;
	// 	auto as = num.size(), bs = B.num.size(), rs = as + bs + 2;
	// 	res.num.resize(rs);
	// 	for (int i = 0; i < as; ++i)
	// 		for (int j = 0; j < bs; ++j)
	// 			res.num[i + j - 1] += num[i] * B.num[j];
	// 	for (int i = 0; i < rs; ++i)
	// 		if (res.num[i] >= 10)
	// 			res.num[i + 1] += res.num[i] / 10, res.num[i] %= 10;
	// 	return res.clear_0();
	// }
	template <typename t>
	bint operator*=(const t &B)
	{
		return (*this) = (*this) * B;
	}
	friend ostream &operator<<(ostream &out, const bint &x)
	{
		// clear_0();
		if (!x.num.size())
			return out.put('0');
		for (int i = x.num.size() - 1; i >= 0; --i)
			out << x.num[i];
		return out;
	}
};

int k, x, y;
int a[32];               // 存n的各位
unordered_set<int> S[32];// n各位可以放啥
bool changable[10][10];  // changable[i][j]: i能否产生j
char c;
int len;
bint ans = 1;            // 高精存答案
int main()
{
	// 读入
	while (c = getchar(), isdigit(c))
		a[len++] = c - '0';
	cin >> k;
	for (int i = 1; i <= k; ++i)
		cin >> x >> y, changable[x][y] = true;
	// Floyd传递闭包
	for (int i = 0; i <= 9; changable[i][i] = true, ++i)
		for (int j = i + 1; j <= 9; ++j)
		{
			if (!changable[i][j])
				for (int k = 0; k <= 9; ++k)
					if (changable[i][k] && changable[k][j])
					{
						changable[i][j] = true;
						break;
					}
			if (!changable[j][i])
				for (int k = 0; k <= 9; ++k)
					if (changable[k][i] && changable[j][k])
					{
						changable[j][i] = true;
						break;
					}
		}
	for (int i = 0; i <= 9; ++i)
		for (int j = 0; j <= 9; ++j)
			if (changable[i][j])
				for (int k = 0; k < len; ++k)
					if (a[k] == i)
						S[k].insert(j);
	// 乘法原理求总数
	for (int j = 0; j < len; ++j)
		ans *= S[j].size();
	// 输出(已重载operator<<(ostream&, const bint&))
	cout << ans;
	return 0;
}
2025/1/10 09:25
加载中...