2002年分区联赛普级组之三 产生数

来源:互联网 发布:手机图章制作软件 编辑:程序博客网 时间:2024/04/27 17:03

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


解题思路:先读入数据,并记录一个数字在原数中出现的次数和用布尔型标记每个数可以变成什么数,然后用高精度乘法计算,最后输出计算结果即可。


程序:
var
  f:array[0..9,0..9] of boolean;
  a:array[0..500] of longint;
  q:array[0..9] of longint;
  i,j,k,x,y,m,num:longint;
  ch:char;

procedure mul(x:longint);
  var
    i,g,s:longint;
  begin
    g:=0;
    for i:=100 downto 1 do
      begin
        s:=a[i]*x+g;
        a[i]:=s mod 10;
        g:=s div 10;
      end;
end;

begin
  read(ch);
  while ch<>' ' do
    begin
      val(ch,num);
      inc(q[num]);
      read(ch);
    end;
  readln(m);
  for i:=1 to m do
    begin
      readln(x,y);
      f[x,y]:=true;
    end;
  for k:=1 to 9 do
    for i:=0 to 9 do
      for j:=1 to 9 do
        f[i,j]:=f[i,j] or (f[i,k] and f[k,j]);
  a[100]:=1;
  for i:=0 to 9 do
    begin
      num:=1;
      for j:=1 to 9 do
        if (f[i,j])and(i<>j) then inc(num);
      for j:=1 to q[i] do
        mul(num);
    end;
  j:=1;
  while a[j]=0 do
    inc(j);
  for i:=j to 100 do
    write(a[i]);
end.


版权属于: Chris
原文地址: http://blog.sina.com.cn/s/blog_83ac6af80102v0xf.html
转载时必须以链接形式注明原始出处及本声明。
0 0