題目:
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行。output第一行給出乙個n,表示x為中數字的個數。(1<=n<=15)
第二行給出n位數的正整數x(x中至少有一位數大於1)
共一行,表示符合上述條件的最大值。input示例
4output示例1234
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 ...