HihoCoder - 1789:阶乘问题 (简单数学)

描述

给定 n, k,求一个最大的整数 m,使得 km 是 n! 的约数

输入

第一行两个正整数 n, k

2 ≤ n,k ≤ 109

输出

输出最大的 m

样例输入
5 2
样例输出
3

思路:我们知道一个素数在阶乘里的幂次就是一直除就好了。 这题通过率低,是因为直接把K拿来除了,注意这里要是素数才行。 

所以我们分解求最小即可。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll ans=1000000000;
ll get(int a,int n)
{
    ll res=0; while(n){
        res+=n/a; n/=a;
    } return res;
}
int main()
{
    int N,K;
    scanf("%d%d",&N,&K);
    for(int i=2;i*i<=K;i++){
        if(K%i==0){
            int num=0; while(K%i==0) num++,K/=i;
            ans=min(ans,get(i,N)/num);
        }
    }
    if(K>1) ans=min(ans,get(K,N));
    printf("%lld\n",ans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/hua-dong/p/10226609.html
今日推荐