牛客网Wannafly挑战赛25 A题

题目大意

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


分析

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


代码

#include 
#include 
#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>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<

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

你可能感兴趣的:(牛客网Wannafly挑战赛25 A题)