文章
5
粉丝
161
获赞
15
访问
20.0k
此题解是对前面题解的详细解答。(是看了各位大神的代码才知道怎么写的,自己想我大概是想不出来的,感谢各位佬)
题干:给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。(这是幂运算,别看成乘法。)
两个整数n(2<=n<=1000),a(2<=a<=1000)。看一眼范围可以知道这个数的阶乘很大,一些类型会爆掉。既然会爆掉,那肯定不是正常的写法,再看这题是出现在分解素因数的章节,那自然要往上面想。。
再看题干,先考虑整除。既然是整除,那么有两点,①取模==0 or ② n!>= a 时候相除为整数。至于用到那个呢,得考虑质因数。我们知道,对于任意一个大于 1 的整数,它都可以分解成多个质因子相乘的形式。所以,用②。这个时候脑袋大约会想到把n!写成n*(n-1)*。。。/a*a。。。,然后在把他们写成质因子相乘的形式,然后约分的那个过程。既然相除结果为整数,那么约分以后分母不存在任何东西。而题干也要求整除,也就是说a的质因子全是n!的质因子的子集。也就是说,相同的质因子都会约下去,直到a的那个质因子个数为0。这肯定得一起约吧,比如
n=6
6!=6*5*4*3*2 = 2*3*5*2*2*3*2 = 2^4*3^2*5
a=6 = 2*3
6!/6 =2^(4-1)*3^(2-1)*5=120
好,既然知道以上的形式,那么问题就变成了,求质因子以及统计相同质因子的个数。
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
//getPrime就是统计质因子个数的。
void getPrime(vector<int>& factors, int n){
for(int i=2; i*i<=n; i++){
while(n % i == 0){
factors[i]++;
//相当于用数组计数,因为题中范围不大,所以可以直接开辟一个1000的数组。
//并不是所有位置都用,只...
登录后发布评论
好像factor_a和factor_n得开大一点吧