题目描述
给出一个整数 n(n<10^30)和 k 个变换规则(k≤15)。
规则:
一位数可变换成另一个一位数。
规则的右部不能为零。
例如:n=234。有规则(k=2):
2->5
3->6
上面的整数 234 经过变换后可能产生出的整数为(包括原数):
234
534
264
564
共 4 种不同的产生数。
现在给出一个整数 n 和 k 个规则。求出经过任意次的变换(0次或多次),能产生出多少个不同整数。
仅要求输出个数。
输入格式
第一行两个整数 n,k。
接下来 kk 行,每行两个整数 xi,yi。
输出格式
输出能生成的数字个数。
输入输出样例``
每种变换之间相互独立。
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <queue>
#include <climits>
#include <map>
#include <cmath>
using namespace std;
int f[10][10], cnt[10], res[105];
int main()
{
string s;
int k;
int a, b;
cin >> s >> k;
for (int i = 0; i < k; i++)
{
cin >> a >> b;
f[a][b] = 1;
}
for (int i = 0; i < 10; i++)
{
f[i][i] = 1;
}
for (int k = 0; k < 10; k++)
{
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
f[i][j] = f[i][j] | (f[i][k] && f[k][j]);
}
}
}
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
if (f[i][j])
{
cnt[i]++;
}
}
}
int len = 2;
res[1] = 1;
for (int i = 0; i < s.size(); i++)
{
for (int j = 1; j <= 100; j++)
{
res[j] *= cnt[s[i] - '0'];
}
for (int j = 1; j <= 100; j++)
{
if (res[j] >= 10)
{
res[j + 1] += res[j] / 10;
res[j] %= 10;
}
}
while (res[len])
len++;
}
for (int i = len - 1; i > 0; i--)
{
cout << res[i];
}
return 0;
}