两道阶乘题做法

其实蛮简单的。。。

 

【fac】

求n!末尾第一位非0数。

【pku1150】

求p(n,m)末尾第一位非0数。

n非常大。。。

第一题n达到10^100次方。。。这个显然无法模拟。。。如果直接做无论空间或者时间都无法支持。。

第二题n达到2000000,显然也是无法模拟的

 

我们注意到 零必然是由2和5支持的、5的个数比2的个数少

同时

1 2 3 4 5 6 7 8 9 10 11 12 13 14

f(n)为n!末尾第一位非0数。

我们注意到 1*2*3*4=24 末尾为4.。。能被4整初。。提出一个2支持5.

同时 6*7*8*9 末尾也为4 、、 能被4乘除。。提出一个2支持5.

n提供了n/5个4 和n/5个5.。。如果mod 5<>0其余的特殊处理一下

每个4提供一个2给5

一共有2^(n/5)...然后5的倍数提出5后变成 1 2  3 4 5 6 7 8 9、、

 

f(n)=2^(n/5)*1*2*3*4*5、、、*p【n mod 5)】(p为特殊处理部分)

f(n)=2^(n/5)*f(n/5)

递归处理即可

n除以5要高精。。其实可以乘2除以10就可以。。节约代码。、、

 

 

pku1150

 

这题有点不一样。。无法直接除。。必需换其他方法做。。。

我们可以将2,5提出、、末尾非0数就是1 3 7 9个数决定的了这个只要知道个数就很好求了。。

2和5的个数我们可以在log(n)时间内求出来

 

首先1 2 3 4 5 6 7 8 。将其分成奇数偶数组。。。

2 4 6 8 10.

1 3 5 7 9、、、、、、

 

将偶数组2 4 6 8 10. 12 的2提出后为1 2 3 4 5 6 7.。。。。。

f(n):=f(n/2)+g(n)

g(n)表示n中几个提出2和5的后尾数为k。。

1 3 5 7 9 11 13 15 17 19 21 23 25.。。

我们注意到其中还有5(5,15,25,35.。。。))

所以再将5提出。。

变为1 3 5 7 9 11 13.。。。。依次递归下去

 

g(n)=g(n/5)+n mod 10+ord(k>=n mod 10)

p(n,m)=n!/(n-m)!

将2,3,5,7,9为尾数的个数求出来。。然后相减。。根据同余求出尾数。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值