云南网站开发网络公司前10,合肥网站设计品牌,建设银行民营企业,创意礼品私人定制产生数
ssl 1021
luogu 1037
题目大意#xff1a;
有一个数#xff0c;可以使某些数字变成相对应的数字#xff0c;问有多少种变法
原题#xff1a;
Description
给出一个整数 n#xff08;n10^30) 和 k 个变换规则#xff08;k15#xff09;。 规则…产生数
ssl 1021
luogu 1037
题目大意
有一个数可以使某些数字变成相对应的数字问有多少种变法
原题
Description
给出一个整数 nn10^30) 和 k 个变换规则k15。 规则 一位数可变换成另一个一位数 规则的右部不能为零。 例如n234。有规则k2 2 5 3 6 上面的整数 234 经过变换后可能产生出的整数为包括原数: 234 534 264 564 共 4 种不同的产生数 问题 给出一个整数 n 和 k 个规则。 求出 经过任意次的变换0次或多次能产生出多少个不同整数。 仅要求输出个数。
Input
n k x1 y1 x2 y2 … … xn yn
Output
一个整数满足条件的个数
Sample Input
234 2
2 5
3 6Sample Output
4解题思路
首先用Floyed求出任意一个数字可以变成什么数字再统计一下每个数可以变成多少个数因为数据保证规则的右方不为0所以不用判断是否为第一位然后用高精乘就可以了
代码
#includecstdio
#includeiostream
#includecstring
#includestring
using namespace std;
int n,x,y,l,sum,a[15][15],b[50],c[15],f[50];
string str;
void gjc(int now)
{int t0;for (int i1;i35;i){f[i]f[i]*nowt;//高精乘tf[i]/10;f[i]%10;}
}
void output()
{int k35;while (!f[k]k0) k--;for (int ik;i0;--i)putchar(f[i]48);//高精输出
}
int main()
{cinstr;lstr.size();for (int i1;il;i)b[i]str[i-1]-48;//读入scanf(%d,n);for (int i1;in;i){scanf(%d %d,x,y);a[x][y]1;}for (int k0;k9;k)for (int i0;i9;i)for (int j0;j9;j)a[i][j]max(a[i][j],min(a[i][k],a[k][j]));//Floyedf[1]1;//预处理for (int i0;i9;i)for (int j0;j9;j)if (a[i][j]||ij)c[i];//统计for (int i1;il;i)gjc(c[b[i]]);//高精乘output();
}