题目描述
给出一个整数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
输出格式:
屏幕输出,格式为:
1个整数(满足条件的个数):
输入输出样例
输入样例#1
234 2 2 5 3 6
输出样例#1
4
思路
本题的性质相当于排列组合。每一位的数字可以转换成的数字的个数的乘积。floyd求出每个数字可以变成多少种数。
#include <stdio.h>
#include <iostream>
using namespace std;
int n,k,f[11][11];
int a[2001],d[11],x,y;
string str;
inline void munite()
{
int i,j;
a[0]=1;
for(i=0;str[i];i++)
{
int t(0);
x=d[str[i]-'0'];
for(j=0;j<1000;j++)
{
a[j]=a[j]*x+t;
t=a[j]/10;
a[j]%=10;
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int i,j,k;
while(cin>>str>>n)
{
for(i=0;i<n;i++)
{
cin>>x>>y;
f[x][y]=1;
}
for(k=1;k<=9;k++)
{
for(i=0;i<=9;i++)
{
for(j=1;j<=9;j++)
{
if(f[i][k] && f[k][j])
{
f[i][j]=1;
}
}
}
}
for(i=0;i<=9;i++)
{
f[i][i]=1;
for(j=0;j<=9;j++)
{
if(f[i][j])
{
d[i]++;
}
}
}
munite();
i=1000;
while(a[i]==0)
{
i--;
}
for(;i>=0;i--)
{
cout<<a[i];
}
cout<<endl;
}
cout<<endl;
return 0;
}