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

2021-08-10 03:05:42 字數 1289 閱讀 7906

題目:

現在定義 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

<< endl;

return

0;}

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

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