题目描述:
给定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的部分。