2009-05-11 14:07:04 Accepted 2845 C++ 0.8K 0'00.00" 1204K
   本题意为求n!的b进制末尾有几个0.
   一开始猛然想到ZOJ上有一题也是求Factorial的,不过只是对于10进制而言。
   网址:
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1022
   对于任意进制的求法没碰到过。回想当初这题是每次除5往上加,因为对于十进制末尾的0始终是有5 * 2得到的,而2的个数绝对比5多,故只需计算5的个数即可。
   后来QQ上问了才知道,对于b进制,每次都需要求b的质因子,然后以n去除b的某个质因子,再每次往上加,对这么多结果中取一个最小值即可。
   取质因子可以这么写

   

int get_small_ans(int n, int b)
{
    bool flag = true;
    int cnt, ans = 0;
    int i;

    for(i = 2; i * i <= b; i++)
    {
        cnt = 0;
        while(b % i == 0)
        {//每次去进制的质因子
            b /= i;
            cnt++;
        }

        if(cnt)
        {
            if(flag)
            {
                ans = get_ans(n, i) / cnt;
                flag = false;
            }
            else //取进制质因子中的最小一个
                ans = min(ans, get_ans(n, i) / cnt);
        }

    }

    if(b > 1)
    {    
        if(flag)
            ans = get_ans(n, b);
        else
            ans = min(ans, get_ans(n, b));
    }
    return ans;
}

   每次用n除b的质因子往上加时这样写的

int get_ans(int n, int b)
{
    int sum = 0;

    while(n / b)
    {
        sum += n / b;
        n /= b;
    }
    return sum;
}