給出乙個整數 n(n<1030) 和 k 個變換規則(k<=15)。規則:一位數可變換成另乙個一位數:
規則的右部不能為零。
例如:n=234。有規則(k=2):
2-> 5
3-> 6
上面的整數 234 經過變換後可能產生出的整數為(包括原數):
234534
264564
共 4 種不同的產生數
問題:給出乙個整數 n 和 k 個規則。
求出:經過任意次的變換(0次或多次),能產生出多少個不同整數。
僅要求輸出個數。
鍵盤輸人,格式為:n kx1 y1
x2 y2
… …xn yn
螢幕輸出,格式為:乙個整數(滿足條件的個數)樣例輸入
234 2樣例輸出題目的題面描述很容易讓人誤認為是搜尋題,但實際不是,取最壞的情況比如下面的輸入資料:2 53 6
111111111111111111111111111111 9
1 22 3
3 44 5
5 66 7
7 88 9
9 1每個數字都有9種選擇,答案為930==42391158275216203514294433201,搜尋一定會超時。
正解為先對每個數字進行一遍dfs求出每個數字可能變換的情況,最後再利用乘法計數原理逐位計算出最終可能的所有情況。結果需要用到高精度儲存。
#include
#define ll long long
#define next next_
using
namespace std;
ll len,k,u[22]
,v[22
],num[11]
;string s,ans=
"1";
bool vis[11]
;void
dfs(ll t)}}
}string its
(ll a)
string mul
(string a,string b)}}
if(cc[lena+lenb]
) s+
=cc[lena+lenb]
+'0'
;for
(int i=lena+lenb-
1;i>=
1;i--
) s+
=cc[i]
+'0'
;return s;
}int
main()
for(ll i=
0;i) ans=
mul(ans,
its(num[s[i]
-'0'])
);cout
}
codevs 1009 產生數 題解報告
繼續我的刷題路 題目描述 description 給出乙個整數 n n 10 30 和 k 個變換規則 k 15 規則 一位數可變換成另乙個一位數 規則的右部不能為零。例如 n 234。有規則 k 2 2 5 3 6 上面的整數 234 經過變換後可能產生出的整數為 包括原數 234 534 264...
洛谷P1037產生數題解 zhengjun
題目描述 給出乙個整數 n nn n 10 30n lt 10 n 10 30 和 k kk 個變換規則 k 15 k le 15 k 15 規則 一位數可變換成另乙個一位數。規則的右部不能為零。例如 n 234 n 234 n 23 4。有規則 k 2 k 2k 2 上面的整數 234234 經過...
題解 單詞接龍(DFS)
單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞 且給定乙個開頭的字母,要求出以這個字母開頭的最長的 龍 每個單詞都最多在 龍 現兩次 在兩個單詞相連時,其重合部分合為一部分,例如beast和astonish,如果接成一條龍則變為beastonish 另外相鄰的兩部分不能存在包...