hihoCoder 编程练习赛69 - C 阶乘问题

题目

POINT:

把k分解质因数,并存下每个质因数有几个。

再看n!里有多少个这些质因数。

取最少的倍数就ok了。

这个就是用来求n!里有多少k这个质因数的。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <string>
#include <map>
using namespace std;
#define LL long long
const int MAXN = 1e6+66;
LL n,k;

LL f(int k)
{
    LL ans=0;
    LL now = k;
    while(now<=n){
        ans+=n/now;
        now=now*k;
    }
    return ans;
}

LL prime[MAXN+1];

void getPrime()
{
    memset(prime,0,sizeof(prime));
    for(int i=2;i<=MAXN;i++)
    {
        if(!prime[i])prime[++prime[0]]=i;
        for(int j=1;j<=prime[0]&&prime[j]<=MAXN/i;j++)
        {
            prime[prime[j]*i]=1;
            if(i%prime[j]==0)
                break;
        }
    }
}


LL a[50000],cnt=0;
LL num[50000];
void ff(LL k)
{
    for(int i=1;i<=prime[0];i++){
        if(prime[i]>k) break;
        if(k%prime[i]==0){
            a[++cnt]=prime[i];
            while(k%prime[i]==0){
                num[cnt]++;
                k/=prime[i];
            }
        }
    }
    if(k>1){
        a[++cnt]=prime[k];
        num[cnt]++;
    }
}

int main()
{
    getPrime();
    scanf("%lld%lld",&n,&k);
    ff(k);
    LL ans=121111113123LL;
    for(int i=1;i<=cnt;i++){
        LL you=f(a[i]);
        ans=min(ans,you/num[i]);
    }
    printf("%lld\n",ans);

    return 0;
}

猜你喜欢

转载自blog.csdn.net/mr_treeeee/article/details/81157300
今日推荐