题意:这个题题意个人觉得蛮难懂的。。。。意思就是求,把十进制下的n!转化成m进制,末位有且仅有k个连续的0。告诉n和k,求满足题意的m有多少个。
1<= k <= 10^15,n <= 10^15,保证n / k < 500。
解法:首先,用f(x,y)表示对于某数i,(x % (i^y)) == 0的i的个数,则题目即是求f(n!, k) - f(n!, k+1)。
其次,判断数i^k能不能被x整除的方法是,将i因式分解为i = p1^t1 * p2^t2 * P3^t3.....,则对于i的任意一个质因子p_i,x所含有p的次数要大等于t_i。
最后,求n!含有素数p的次数的方法是,sum = 0, while(n){ n /= p; sum += n;},sum即为所求次数。具体原因是,比如10!的阶乘含2的次数,那么2,4,6,8,10各含一个2,然后4,8各含一个2,然后8含一个2,这样,10!含有2的次数即是5+2+1。
这样,我们就得到了这道题的如下解法。首先,预处理出n!阶乘中含有次数大等于k的素数,并保存他们的次数。然后,用组合数学的方法求出满足题意的m有多少个。至于第一步为什么不会超时,是因为满足k <= n/i + n/i^2 + n/i^3 + n/i^4... <= n/i + n/i(类比2,发现后面加起来不会超过n/i) < 2*n / i,所以i <= 2*n/k < 1000,所以及时break就行了。
tag:math, think, good