牛客网Wannafly挑战赛25 A题

题目大意

题目链接
给你n,p两个数,求n的阶乘中p做为因子出现的个数


分析

如果p为质数的话,很容易求出p出现的次数,但是这道题p可能为合数,由数学知识可以知道任意一个数都可以通过质数相乘来得到,所以我就将p分解为多个质数来相乘,同时求出相应的质数在n的阶乘中出现的次数a,同时我也要求出质数在p中出现的次数b(一个质数可以出现多次),最后的结果就是多个质数的a/b值的最小值。


代码

#include <bits/stdc++.h>
#include <stdio.h>
#define INF 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int MAX_N=10002;
bool prime[MAX_N];
void getprime()
{
    memset(prime,true,sizeof(prime));
    prime[0]=false;
    prime[1]=false;
    for(int i=2;i<MAX_N;i++)
    {
        if(prime[i]==true)
        {
            for(int j=i+i;j<MAX_N;j+=i)
            {
                prime[j]=false;
            }
        }
    }
}
ull number(ull n,int num)
{
    ull sum=0;
    while(n)
    {
        n=n/(ull)num;
        sum+=n;
    }
    return sum;
}
int main()
{
    //freopen("data.txt","r",stdin);
    getprime();
    int p;
    ull n;
    cin>>n>>p;
    ull result=INF;
    for(int i=1;i<=p;i++)
    {
        if(prime[i]&&p%i==0)
        {
            int mid=p;
            int cnt=0;
            while(mid%i==0)
            {
                mid=mid/i;
                cnt++;
            }
            ull res1=number(n,i);
            res1=res1/cnt;
            result=min(result,res1);
        }
    }
    cout<<result<<endl;
    return 0;
}

总结
要明白这道题的思维过程,并能举一反三,求类似这样的问题。同时开数组的时候要注意0的个数。如果题目中要多次用到素数,那么就采用打表的方式一次求出所有的素数(埃氏筛选法则)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容