牛客小白月赛23 B题

给定一个正整数 p
求一个最小的正整数 n,使得 n! 是 p 的倍数 题目看起来很简单也很好理解,但是显然这题数据 p数据范围1<=p<=1e9且T<=1000测试组数,显然一看直接求阶乘对比是不现实的,阶乘的数据范围太大了,所以这题很显然就是一到类似数论的题,显然对于每个数我们都可以将其拆分成n多个因子相乘的格式。例如48=246,我们就可以得到48对应的结果就应该是6,了解完大致原理,直接开始分析题目:
1)首选考虑p为素数和1的情况很显然,没有别的因子只有1和本身因而,阶乘只能是本身的阶乘,直接输出p就可以啦。
2)对于其他含有因子的数我们就要对其因子进行拆分,而且不能有重复的因子,因为阶乘就是1*2…这样的,然后每次找到一个因子就对应的p/=x(该因子)这时候大家应该想到边界就是gcd(p,x)==1,直接输出就好啦,但是最开始是这么交了一发直接超时,于是我就仔细考虑了一下特列,加入某个数有个因子是质数的话,而且这个质数还很大,那么按照我们之前的思路就会达到
O(n)复杂度,加上T(1e3)很显然tle啦,这里如果是质数且x!=p&&x<p我们就可以直接输出p啦,等于是不行的也是阶乘不可以存在等于关系,大致思路就是这样直接上AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
bool is_primer(int n)
{
    if(n==1)
    {
        return false;
    }
    for(int i=2; i*i<=n; i++)
    {
        if(n%i==0)  return false;
    }
    return true;
}
int gcd(int a,int b)
{
    if(b==0)
    {
        return a;
    }
    else
    {
        return gcd(b,a%b);
    }
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int p;
        cin>>p;
        if(p==1)
        {
            cout<<p<<endl;
        }
        else if(is_primer(p))
        {
            cout<<p<<endl;
        }
        else
        {
            for(int i=2;;i++)
            {
                if(gcd(i,p)!=1)
                {
                    p/=gcd(i,p);
                    if(p==1)
                    {
                        cout<<i<<endl;
                        break;
                    }
                }
                if(is_primer(p)&&i<p)
                {
                    cout << p << endl;
                    break;
                }
            }
        }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值