题目描述
给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。
输入描述:
两个整数n(2<=n<=1000),a(2<=a<=1000)
输出描述:
一个整数.
示例1
输入
6 10
输出
1
最终AC代码如下:
#include <bits/stdc++.h> using namespace std; int main(){ int n, a; while(cin >> n >> a){ int t, ans=1e9, rn[1001]={0}; for(int i=2; i<=n; i++){ //n!质因子分解 t = n; while(t){ rn[i] += t / i; t /= i; } } for(int i=2; i<=a; i++){ //a的质因子分解 t = 0; while(a%i == 0){ t++; a /= i; } if(t == 0) continue; ans = min(ans, rn[i]/t); } printf("%d ", ans); } return 0; }
总结:这题用常规思路是没法做出来的,因此数据太大。然后,在评论区看见了以下分析,很有趣(链接):
我上面写的代码没有找出找出素数,但是代码更简洁,在考场上也能解决一些时间。但是,为什么有这个规律,我目前也不是很理解。记录此题的本意是,一个正整数阶乘 => 是可以转化为素数的表达形式的~或者说,任何一个大于1的数都可以表示成这种形式吧?然后,以下部分的代码很经典~
for(int i=2; i<=n; i++){ //n!质因子分解 t = n; while(t){ rn[i] += t / i; t /= i; } }
采用素数表示阶乘,很自然地化解了数据非常大的问题。以后依据大整数的问题,希望能够想起这个思路。