九度oj-1104

题目描述:

给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。

输入:

两个整数n(2<=n<=1000),a(2<=a<=1000)

输出:

一个整数.

样例输入:

6 10

样例输出:

1

代码:

#include <iostream>  
using namespace std;  

int main(){  
    int n,a;  
    while(cin>>n>>a){  
        int count = 0;  
        int sum = 1;  
        for(int i=n;i>=1;i--){  
            sum = sum * i;  
            while(sum % a == 0){  
                count ++;  
                sum = sum/a;  
            }  
            sum = sum % a;  
        }  
        cout<<count<<endl;        
    }  
    return 0;  
}

作者提醒:

本题按照常理做,是不可能解出来的。但看n!的表示就无法实现,当n=1000时,
所有的类型都表示不下,更别说时间复杂度了。

这道题的技巧性很强。我们的方法是,分部计算k的值,即k从1开始累加。

思路:将sum逐步保存n!的值,先是n,再是n*(n-1),然后是n*(n-1)*(n-2)……

在这个过程中,如果发现sum可以被a整除,k的值就自增1,
表示这时的sum可以被a整除(因为是乘法运算,以后当然也可以)。
之后sum就可以缩小为sum/a的部分。