題目描述
給出乙個整數 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 經過變換後可能產生出的整數為(包括原數):
共 4
44 種不同的產生數。
現在給出乙個整數 n
nn 和 k
kk 個規則。求出經過任意次的變換(0
00次或多次),能產生出多少個不同整數。
僅要求輸出個數。
輸入格式
第一行兩個整數 n,k
n,kn,
k。接下來 n
nn 行,每行兩個整數 xi,
yi
x_i,y_i
xi,yi
。輸出格式
輸出能生成的數字個數。
輸入輸出樣例
輸入 #1 複製
23422
536
輸出 #1 複製4
一道弗洛伊德的最入門的題目
就是算出每乙個數字可以轉換成多少種不同的數字,然後把n
nn的每一位上的數可以變換的數字乘起來就可以了,注意n
nn要用字串處理,答案要高精
#include
#include
#include
#include
#include
#include
#include
#include
#define maxl 10000
using
namespace std;
/******************模板******************/
class
bign
;#define max(a,b)((a)>(b)?(a):(b))
#define min(a,b)((a)<(b)?(a):(b))
bign::
bign()
bign::
bign
(const
char
*num)
bign::
bign
(int num)
string bign::
tostr()
const
istream &
operator
>>
(istream &in, bign &num)
ostream &
operator
<<
(ostream &out, bign &num)
bign bign::
operator=(
const
char
*num)
bign bign::
operator=(
int num)
bign bign::
operator=(
const string num)
bool bign::
operator
<
(const bign &num)
const
bool bign::
operator
>
(const bign&num)
const
bool bign::
operator
<=
(const bign&num)
const
bool bign::
operator
>=
(const bign&num)
const
bool bign::
operator!=(
const bign&num)
const
bool bign::
operator==(
const bign&num)
const
bign bign::
operator+(
const bign &num)
const
bign result;
result.len=0;
int temp=0;
for(
int i=
0;temp||i<
(max
(len, num.len)
);i++
) result.sign=sign;
return result;
}bign bign::
operator++(
)bign bign::
operator++(
int)
bign bign::
operator+=
(const bign &num)
bign bign::
operator-(
const bign &num)
constif(
!b.sign)if(
!a.sign)
if(abign result;
result.len=0;
for(
int i=
0,g=
0;i) result.s[result.len++
]=x;
} result.
clean()
;return result;
}bign bign::
operator*(
const bign &num)
const
result.
clean()
; result.sign=
!(sign^num.sign)
;return result;
}bign bign::
operator*(
const
int num)
const
bign bign::
operator*=
(const bign&num)
bign bign::
operator/(
const bign&num)
const
bign divisor=
*this
,divid=num;
divisor.sign=divid.sign=1;
int k=ans.len-1;
int j=len-1;
while
(k>=0)
int key=0;
while
(divid*key<=dividend)key++
; key--
; ans.s[k]
=key;
bign temp=divid*key;
for(
int i=
0;i) temp=temp*10;
divisor=divisor-temp;
k--;}
ans.
clean()
; ans.sign=
!(sign^num.sign)
;return ans;
}bign bign::
operator/=
(const bign&num)
bign bign::
operator%(
const bign& num)
const
bign bign::
pow(
const bign& num)
const
bign bign::
factorial()
const
void bign::
clean()
bign bign::
sqrt
(bign a)
const
return l;
}bign::
~bign()
/******************模板******************/
bign ans;
string n;
int k;
int x[16]
,y[16];
int f[10]
[10];
int t[10]
;int
main()
ans=1;
for(
int i=
0;ilength()
;i++
) ans*
=t[n[i]
-'0'];
cout
}
洛谷 P1037 產生數
description 給出乙個整數 n n 10 30 和 k 個變換規則 k 15 規則 一位數可變換成另乙個一位數 規則的右部不能為零。例如 n 234。有規則 k 2 2 5 3 6 上面的整數 234 經過變換後可能產生出的整數為 包括原數 234 534 264 564 共 4 種不同的...
洛谷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...