蒟蒻求调
#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();
}
template <typename t>
bint operator*=(const t &B)
{
return (*this) = (*this) * B;
}
friend ostream &operator<<(ostream &out, const bint &x)
{
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];
unordered_set<int> S[32];
bool changable[10][10];
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;
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();
cout << ans;
return 0;
}