牛客网 上海交通大学 整除问题

整除问题

时间限制:1秒 空间限制:65536K 热度指数:2120
算法知识视频讲解
校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。

题目描述

给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。

输入描述:

两个整数n(2<=n<=1000),a(2<=a<=1000)

输出描述:

一个整数.
示例1

输入

复制
6 10

输出

复制
1

思路

数据太大不可能直接计算,首先想到的思路应该是将n!和a分解成质因子的幂指数形式。a的分解很简单,关键是在于n!的分解。
考虑某个质因子p,则在1到n中一定有n/p个数,每个数至少向p的幂次贡献了1。(因为至少有n/p个p的倍数属于1到n,而在计算阶乘的时候这些倍数都会算上)。如果n/p为0,那么不可能还会有p的倍数向n!的分解贡献幂次,想一想为什么?
然后计算p*p,则和上面描述的一样,共有n/(p*p)个数对p的幂次贡献了1。为什么不是2呢?这是因为在计算n/p的时候已经计算过一遍了,所以不需要重复计算。
依次迭代,直到n/(p^k)为0,关于p的幂次才算计算完成。

那么如何计算k呢,现在已经得到a和n!的分解了,如果n!可以整除a^k,那么a的所有质因子都可以在n!中找到,并且k为相应幂次的倍数。

n!=p1e1 *p2e2 ··· piei ···
a==p1ee1 *p2ee2 ··· pieei ···

则e1>=k*ee1 ,e2>=k*ee2 ……
找出其中最小的倍数k即可。

#include <iostream>
#include <queue>
#include <stdlib.h>
#include <stdio.h>
#include <map>
#include <string>
#include <cstdlib>
#include <stack><
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值