题目描述
给出一个整数 n(n<10^{30})n(n<1030) 和 kk 个变换规则 (k \le 15)(k≤15) 。
规则:
一位数可变换成另一个一位数:
规则的右部不能为零。
例如: n=234n=234 。有规则( k=2k=2 ):
22 -> 55
33 -> 66
上面的整数 234234 经过变换后可能产生出的整数为(包括原数):
234234
534534
264264
564564
共 44 种不同的产生数
问题:
给出一个整数 nn 和 kk 个规则。
求出:
经过任意次的变换( 00 次或多次),能产生出多少个不同整数。
仅要求输出个数。
输入输出格式
输入格式:键盘输入,格式为:
n knk
x_1 y_1x1y1
x_2 y_2x2y2
... ...
x_n y_nxnyn
输出格式:屏幕输出,格式为:
11 个整数(满足条件的个数):
输入输出样例
#include<bits/stdc++.h>
using namespace std;
char q[100] ;
int ans[100];
int temp[10];
int book[10];
vector<int>tu[10];
void dfs(int node)
{
temp[node] = 1;
for(int i = 0 ; i < tu[node].size(); i ++)
{
//temp[tu[node][i]] = 1;
if( temp[tu[node][i]] == 0 )
dfs(tu[node][i]);
}
}
int main()
{
int n ;
cin >> q >> n;
for(int i = 1; i <= n ; i ++)
{
int a , b;
cin >> a >> b;
tu[a].push_back(b);
}
for(int i = 0 ; i <= 9 ;i ++)
{
memset(temp , 0, sizeof(temp));
dfs(i);
int sum = 0;
for(int j = 0 ; j <= 9 ; j ++)
if(temp[j] == 1)
sum ++;
book[i] = sum;
}
/*
for(int i = 0 ; i <= 9 ; i ++)
cout << book[i] << " ";
cout << endl;
*/
ans[0] = 1;
int num = 0;
//cout << strlen(q) << endl;
for(int i = 0 ; i < strlen(q) ; i ++)
{
num ++ ;
int sum = book[q[i] - '0'];
//cout << sum << endl;
int x = 0;
for(int j = 0 ; j < 100 ; j ++)
{
ans[j] = ans[j] * sum + x;
x = ans[j] / 10;
ans[j] %= 10;
}
/*for(int j = 4 ; j >= 0 ; j --)
cout << ans[j];
cout << endl;
*/
}
// cout << num << endl;;
int endd = 99;
while(!ans[endd] && endd > 0)
endd --;
for(int i = endd ; i >= 0 ; i --)
cout << ans[i];
return 0;
}