【牛客】阶乘(唯一分解定理+二分):

给定正整数p,找到最小的正整数n,使得n!是p的倍数。利用唯一分解定理和二分搜索在大数范围内寻找答案。题目涉及到数论和算法优化。
摘要由CSDN通过智能技术生成

【题目传送门】 here~

题目描述

给定一个正整数 p 求一个最小的正整数 n,使得 n! 是 p 的倍数

输入描述:

第一行输入一个正整数T表示测试数据组数接下来T行,每行一个正整数p

输出描述:

输出T行,对于每组测试数据输出满足条件的最小的n

示例1

输入

4
1
2
4
8

输出

1
2
4
4

备注:

在这里插入图片描述

首先这一题涉及到了唯一分解定理,
那么什么是唯一分解定理呢,在我们分析思路之前,来让我们看一下百度百科的解释 ~

任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积N=P1 a1 * P2a2 * P3a3 … Pnan,这里P1<P2<P3…<Pn均为质数,其中指数ai是正整数。这样的分解称为 N 的标准分解式。最早证明是由欧几里得给出的。
解释的很清楚,下面来给出个例子:
48 --> 6 * 8 --> 2 * 3 * 4 * 2 --> 2 * 3 * 2 * 2 * 2 --> 24 * 31;

分析思路:

  • 了解完唯一分解定理之后,我们可以知道要满足N!是P的倍数的话,可以先对N!和P都使用唯一分解定理,需要使N!分解出来每个质数的指数都大于等于 P分解出来的每个质数的指数;(不太好描述,看例子比较好理解)
    这里举个例子来帮助了解一下:假设我们的p=48,利用唯一分解定理得到p=24 * 31(注意这里2的指数和3的指数);要使N!是p的倍数,则 N!使用唯一分解定理后的得到的式子必须满足N!= 2a * 3b * c; 若满足条件则必须使 a>=4 && b>=1 && c>=1;

  • 我们明确了要查找的N!要满足的条件之后,我们可以看到这一题的数据范围非常大达到1e9,这个时候我们就要考虑利用二分来查找,取l=1,r=1e9;如果mid符合条件那么我们就舍弃左边部分,因为是阶乘,如果mid不符合条件,那么1-mid也都是不符合,因此舍弃左边部分,然后一直维护ans的值即可。

AC代码:

#include<bits/stdc++.h>
using 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值