2002年分区联赛普级组之三 产生数
Time Limit:1000MS Memory Limit:65536K
Total Submit:180 Accepted:78
Description
给出一个整数 n(n<10^30) 和 k 个变换规则(k<=15)。
规则:
一位数可变换成另一个一位数:
规则的右部不能为零。
例如:n=234。有规则(k=2):
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 6
Sample Output
4
Source
elba
var a:array[0..9,0..9]of boolean; b:array[0..9]of longint; ans:array[0..100]of longint; n,nn:string; s,m,i,j,k,x,y,t,g:longint; begin readln(n);//太大了 s:=pos(' ',n);//算出空格的位置 nn:=copy(n,s,length(n)-s+1);//方案数的字符串 val(nn,m);//转成数字 delete(n,s,length(n)-s+1);//只剩下“整数”n for i:=1 to m do begin readln(x,y); a[x,y]:=true;//连通 end; for i:=0 to 9 do//Floyd~ for j:=0 to 9 do for k:=0 to 9 do a[j,k]:=a[j,k] or (a[j,i] and a[i,k]);//找通路 for i:=0 to 9 do a[i,i]:=true;//从自己走到自己(包括原数) for i:=0 to 9 do for j:=0 to 9 do if a[i,j] then inc(b[i]);//统计从i到j的方案数 ans[100]:=1;//初始化(乘法啊) for i:=1 to length(n) do begin s:=ord(n[i])-48; if b[s]<>0 then begin g:=0;//进位清零 for j:=100 downto 1 do//高精度乘法 begin t:=ans[j]*b[s]+g; ans[j]:=t mod 10; g:=t div 10; end; end; end; i:=0; while ans[i]=0 do inc(i);//去零 for j:=i to 100 do write(ans[j]); end.
//第二次交了,好烦啊。(原因:公告:友情提示)这么负责,就给点赞和访问量吧_(:3」∠)_