给出一个整数 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,kn,k。
接下来 kk 行,每行两个整数 x,y
输出格式
输出能生成的数字个数。
输入输出样例
输入: 输出:
234 2 4
2 5
3 6
#include<iostream>
#include<string>
using namespace std;
string N;//用来承接传递进来的数;
int s[33]={0},//分装N的数
num[33]={0},//记录一个数字的转化规则
k=0,//记录总规则数
nx[33][16]={0},//记录转化的规则
qaq=0;//记录一个数真实转化规则个数
bool use[10]={0};//记录10个数字的使用
long long ans[33];//最后输出voiddfs(int x, int y)//深搜,判断一个数字的转化规则{if(use[y])return;
use[x]=1;
qaq++;for(int i =1; i <= num[y]; i++)dfs(y, nx[y][i]);
use[x]=0;}//处理高精度大数voidmul(){
int jw =0;for(int i =30; i; i--){
ans[i]= ans[i]* qaq + jw;
jw = ans[i]/10;
ans[i]%=10;}}
int main(){
ans[30]=1;
cin >>N>> k;
int len =N.size();for(int i =0; i < len; i++){
s[i +1]=N[i]-'0';}for(int i =1; i <= k; i++){
int x, y;
cin >> x >> y;
nx[x][++num[x]]= y;}for(int i =1; i <= len; i++){
qaq =1;for(int j =1; j <= num[s[i]]; j++)dfs(s[i], nx[s[i]][j]);mul();}
int L=0;while(ans[L]==0){L++;}for(int i =L; i <=30; i++)
cout << ans[i];return0;}