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
floyd+高精度:
1.用floyd求出每個數字間接或直接變成的數字有多少種。
2.將每一位可以變的數量乘起來;
位數過大,要用高精度,不然會炸。
var
f:array [0..9,0..9] of boolean;
a:array [0..9] of longint;
ans:array [1..111] of longint;
i,j,k,m,x,y,l,ll:longint;
n,aa:string;
begin
readln(n);
aa:=copy(n,pos(' ',n)+1,length(n)-pos(' ',n));
val(aa,m);
n:=copy(n,1,pos(' ',n)-1);
for i:=1
to m do
begin
readln(x,y);
f[x,y]:=true;
end;
for k:=0to9
dofor i:=0to9
dofor j:=0to9
do f[i,j]:=f[i,j] or (f[i,k] and f[k,j]);
for i:=0to9
do f[i,i]:=true;
for i:=0to9
dofor j:=0to9
doif f[i,j] then inc(a[i]);
l:=1; ans[1]:=1;
for i:=1
to length(n) do
begin
y:=a[ord(n[i])-48];
for j:=1
to l do ans[j]:=ans[j]*y;
for j:=1
to l+1
dobegin
ans[j+1]:=ans[j+1]+ans[j] div
10; ans[j]:=ans[j] mod
10; end;
if ans[l+1]>0
then inc(l);
end;
for i:=l downto1do
write(ans[i]);
end.
洛谷P1037產生數
給出乙個整數n n 2000 和k個變換規則 k 15 規則 1個數字可以變換成另1個數字 規則中,右邊的數字不能為零。例如 n 234,k 2規則為 2 5 3 6 上面的整數234經過變換後可能產生出的整數為 包括原數 234,534,264,564共4種不同的產生數。求經過任意次的變換 0次或...
洛谷P1037 產生數
題目鏈結 本著 水題不可大做 的原則,我直接字串hash 爆搜,成功爆棧。我們發現,依次搜尋每一位能取到的數字個數,最後乘起來即可 乘法原理 然後又爆了乙個點。long long存不下!於是我面向資料程式設計,看到輸出的數後面有很多0 就產生了這個神奇的騙分做法 include include in...
洛谷 P1037 產生數
給出乙個整數n n 2000 和k個變換規則 k 15 規則 1個數字可以變換成另1個數字 規則中,右邊的數字不能為零。例如 n 234,k 2規則為 2 5 3 6 上面的整數234經過變換後可能產生出的整數為 包括原數 234,534,264,564共4種不同的產生數。求經過任意 次的變換 0次...