洛谷 P1037 產生數

2021-07-25 05:30:32 字數 1791 閱讀 7881

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次...