a=[5,25,125,625,3125] b=[2,4,8,16,32,64,128,256,512,1024,2048,4096,8192] suma=sumb=0 for i inrange(n+1): for j inrange(4): if i>=a[j] and i<a[j+1]: suma+=j+1 if i>=a[4]: suma+=5 for i inrange(n+1): for j inrange(12): if i>=b[j] and i<b[j+1]: sumb+=j+1 if i>=b[12]: sumb+=13 returnmin(suma,sumb)
这么写很直观,但是判断上太麻烦,能不能只要有i>a[j]就计数呢?
勒让德定理
这就该引出勒让德定理了:
直观来说就是将竖着的楼梯横着计数 于是乎代码就可以写成这样:
1 2 3 4 5 6 7
a=[5,25,125,625,3125] b=[2,4,8,16,32,64,128,256,512,1024,2048,4096,8192] for i inrange(5): a[i]=n//a[i] for i inrange(13): b[i]=n//b[i] returnmin(sum(a),sum(b))