其实蛮简单的。。。
【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为尾数的个数求出来。。然后相减。。根据同余求出尾数。

3600

被折叠的 条评论
为什么被折叠?



