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.
版權屬於:
2023年分割槽聯賽普級組之三 採藥
description 辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。醫師把他帶到乙個到處都是草藥的山洞裡對他說 孩子,這個山洞裡有一些不同的草藥,採每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時間...
2023年分割槽聯賽普級組之三 乘積最大
2000年分割槽聯賽普級組之三 乘積最大 time limit 1000ms memory limit 65536k total submit 222 accepted 146 description 今年是國際數學聯盟確定的 2000 世界數學年 又恰逢我國著名數學家華羅庚先生誕辰90周年。在華羅...
2023年分割槽聯賽普級組之三 乘積最大
2000年分割槽聯賽普級組之三 乘積最大 time limit 1000ms memory limit 65536k total submit 229 accepted 153 description 今年是國際數學聯盟確定的 2000 世界數學年 又恰逢我國著名數學家華羅庚先生誕辰90周年。在華羅...