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