#24235: 公式推導


jam930725@gmail.com (浮沉沉沉沉沉沉沉沉)

學校 : 國立臺中科技大學
編號 : 124762
來源 : [123.240.115.224]
最後登入時間 :
2022-08-27 13:56:53
f145. 肯尼的階乘位數 -- 第三屆簡單的小競賽 | From: [45.148.11.20] | 發表日期 : 2021-01-29 16:40

f(n) = n! * (n-1)! *...* 2! * 1!
g(n) = f(n) * f(n-1) *... * f(2) * f(1)

求g(n)的位數。

首先,求任何整數 k 的位數,可以透過log求得

=> log10k + 1   (└ ┘是地板函數 floor)

=> n! 的位數 = log10(n!) + 1

這裡可以不用將 n! 求出後進行log運算,可以利用高中學過的公式求得 log10n!

令 B = N*M

則 logaB = logaNM = logaN + logaM

了解了以上公式,則可輕易求出 log10n!

log10(n!) = log10n + log10(n-1) + log10(n-2) ... + log102 + log101

-----------------------------------------------------------------------------------------

接著,來整理 f(n) 及 g(n)的部分

g(n) = f(n) * f(n-1) * f(n-2) ... * f(2) * f(1)

 

             f(n)      =   n! * (n-1)! * (n-2)! ... * 2! * 1!

             f(n-1)   =         (n-1)! * (n-2)! ... * 2! * 1!

             f(n-2)   =                      (n-2)! ... * 2! * 1!

             .

             .

             .

             f(2)    =                                        2! * 1!

X )         f(1)    =                                               1!

-------------------------------------------------------

g(n) = n! * [(n-1)]2 * [(n-1)]3 .... * (2!)n-1 * (1!)n

 

所以g(n)的位數

= log10{ n! * [(n-1)]2 * [(n-1)]3 .... * (2!)n-1 * (1!)} + 1

= log10n! * 2log10(n-1)! * 3log10(n-2)! .... * (n-1)log10(2!) * nlog10(1!)  } + 1

         n - 1

=   Σ [(k+1)log10(n-k)!] + 1

         k = 0

而這裡的 log10(n-k)! 可以藉由前面的方法求得。

所以在程式一開始,我們可以先將1~10000的階乘log10之後的結果建表

double factorial_log10[10005] = {0}; // n! = factorial_log10[n];
for(int i = 1; i < 10005; i++)
    factorial_log10[i] = factorial_log10[i-1] + log10(i);

然後就可以讀取數字,利用迴圈將階乘log之後的結果乘上(k+1)後累加,得到結果

*部分結果會超出unsigned int儲存範圍,需用long儲存

*累加完之後記得 +1

 
#24236: Re:公式推導


jam930725@gmail.com (浮沉沉沉沉沉沉沉沉)

學校 : 國立臺中科技大學
編號 : 124762
來源 : [123.240.115.224]
最後登入時間 :
2022-08-27 13:56:53
f145. 肯尼的階乘位數 -- 第三屆簡單的小競賽 | From: [45.148.11.20] | 發表日期 : 2021-01-29 16:45

n! * [(n-1)]2 * [(n-1)]3 .... * (2!)n-1 * (1!)n

 

更 : [(n-1)!]2 * [(n-1)!]3 才對  少打了!

 

 
#28021: Re:公式推導


cse011417 (哈哈哈)

學校 : 國立臺中高級工業職業學校
編號 : 22273
來源 : [42.77.142.213]
最後登入時間 :
2024-03-20 11:49:15
f145. 肯尼的階乘位數 -- 第三屆簡單的小競賽 | From: [42.77.196.228] | 發表日期 : 2021-11-10 16:25

感謝分享解題想法

 

所以g(n)的位數

└ log10{ n! * [(n-1)]2 * [(n-1)]3 .... * (2!)n-1 * (1!)n   + 1

└ log10n! * 2log10(n-1)! * 3log10(n-2)! .... * (n-1)log10(2!) * nlog10(1!)  ┘ + 1

 

這邊{}拆開應該是變成+,不是*

 

 

 

 

 
ZeroJudge Forum