文章

5

粉丝

161

获赞

12

访问

17.0k

头像
详细题解(站在巨人的肩膀上)
推荐阅读
P1284 上海交通大学机试题
发布于2023年2月16日 14:41
阅读数 3.6k

此题解是对前面题解的详细解答。(是看了各位大神的代码才知道怎么写的,自己想我大概是想不出来的,感谢各位佬)

题干:给定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的数组。
		   //并不是所有位置都用,只...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发