51nod 1435 位數階乘 (手動計算)

2022-04-21 17:10:18 字數 1513 閱讀 7540

題目:

1435 位數階乘

基準時間限制:1 秒 空間限制:131072 kb 分值: 40 難度:4級演算法題

x是乙個n位數的正整數 (x=a0a1...an−1)

現在定義

f(x)=∏i=0n−1(ai!)

, 比如f(135)=1!*3!*5!=720.

我們給定乙個n位數的整數x(至少有一位數大於1,x中可能有前導0),

然後我們去找乙個正整數(s)符合以下條件:

1.這個數盡可能大,

2.這個數中不能含有數字0或1。

3.f(s)=f(x)

input

每個測試資料輸入共2行。

第一行給出乙個n,表示x為中數字的個數。(1<=n<=15)

第二行給出n位數的正整數x(x中至少有一位數大於1)

output

共一行,表示符合上述條件的最大值。
input示例

4

1234

output示例

33222

這題純手動解決,以為有規律,發現數字大了就沒規律了。

解法:把15個9以內的階乘分解成盡量多的2-9的階乘。然後從大的數開始輸出。

這題不管怎麼分都是要從最大的素數因子開始的,要不然就不能分解。

我們能夠想到的是2,3,5,7是沒法再分小了的。

(想想7!怎麼分,第乙個7就沒法分)

所以只有4,6,8,9四個數字的階乘要分,

4分為:1個3!和2個2!

6分為:1個5!和1個3!

8分為:1個7!和3個2!

9分為:1個7!和2個3!和1個2!

這題就是這麼暴力。

我剛開始以為任何大於1的自然數的階乘都可以分成 任意個質數階乘的積。

後來找到了反例(100! = 97!*98*99*100),分出來的3個數字沒法拼成素數階乘的積。

**:

#include #include 

#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;#define inf 2147483647

//num[i] 表示 i! 的數量

int num[11

]; int

main()

else

if(s[i] == '8'

)else

if(s[i] == '6'

)else

if(s[i] == '4'

)else

}for(int i = 9;i >= 2; i--)

cout

<

return0;

}

51nod 1435 位數階乘 (手動計算)

題目 現在定義 f x i 0n 1 ai 比如f 135 1 3 5 720.我們給定乙個n位數的整數x 至少有一位數大於1,x中可能有前導0 然後我們去找乙個正整數 s 符合以下條件 1.這個數盡可能大,2.這個數中不能含有數字0或1。3.f s f x input 每個測試資料輸入共2行。第一...

51nod 1435 位數階乘

原題鏈結 1435 位數階乘 codeforces 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 x是乙個n位數的正整數 x a0a 1.an 1 現在定義 x i 0n 1 a i 比如f 135 1 3 5 720.我們給定乙個n位數的整數x 至少有一位數大...

51nod 1435 位數階乘

1435 位數階乘 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 收藏關注x是乙個n位數的正整數 x a0a1.an 1 現在定義 f x i 0n 1 ai 比如f 135 1 3 5 720.我們給定乙個n位數的整數x 至少有一位數大於1,x中可能有前導0 ...