洛谷P1037產生數題解 zhengjun

2021-10-04 11:42:37 字數 4533 閱讀 7343

題目描述

給出乙個整數 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...