资源限制
时间限制:1.0s 内存限制:256.0MB
给出一个整数 n ( n<10^30) 和k个变换规则(k<=15)。
规则:
(1)1位数可变换成另一个一位数;
(2)规则的右部不能为0。
例如:n=234,有规则(k=2):
2 → 5
3 → 6
上面的整数234经过变换后可能产生出的整数为(包括原数):
234
534
264
564
共4 种不同的产生数
求经过任意次的变换(0次或多次),能产生出多少个不同的整数。仅要求输出不同整数个数。
输入格式
n
k
x1 y1
x2 y2
… …
xn yn
输出格式
格式为一个整数(满足条件的整数个数)。
样例输入
234
2
2 5
3 6
样例输出
4
方法一:
import java.util.Scanner;
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String str=sc.nextLine();
int k=sc.nextInt();
int nums[][]=new int[10][10];
for(int i=0;i<k;i++) {
int x=sc.nextInt();
int y=sc.nextInt();
nums[x][y]=1;
}
for(int i=0;i<10;i++) {
for(int j=0;j<10;j++) {
for(int l=0;l<10;l++) {
if(i!=j&&i!=l&&j!=l) {
if(nums[j][i]==1&&nums[i][l]==1) {
nums[j][l]=1;
}
}
}
}
}
BigInteger ans=BigInteger.ONE;
for(int i=0;i<str.length();i++) {
int num=str.charAt(i)-'0';
int cnt=1;
for(int j=0;j<10;j++) {
cnt+=nums[num][j];
}
ans=ans.multiply(BigInteger.valueOf(cnt));
}
System.out.println(ans);
}
}
方法二:
import java.util.Scanner;
public class Main {
static class Replace{
int yuan;
int xian;
public Replace(int yuan,int xian) {
this.yuan=yuan;
this.xian=xian;
}
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String str=sc.nextLine();
int k=sc.nextInt();
Replace r[]=new Replace[k];
for(int i=0;i<k;i++) {
int y=sc.nextInt();
int x=sc.nextInt();
r[i]=new Replace(y,x);
}
sc.close();
int i=0,count=1;
while(i<str.length()) {
for(int j=0;j<k;j++) {
if(str.charAt(i)-'0'==r[j].yuan) {
count*=2;
break;
}
}
i++;
}
System.out.println(count);
}
}