zoukankan      html  css  js  c++  java
  • [ Luogu 3927 ] Factorial

    (\)

    (Description)


    (N!)(K) 进制表示下末尾 (0) 的个数。

    • (N,Kin [1,10^{12}])

    (\)

    (Solution)


    我又NC了

    考虑何种情况(K)进制下会产生(0),可以类比十进制下的情况,发现(2)(5)的因数各一个就会产生一个(0),这是因为(10=2^1 imes 5^1)。类比的,我们将(K)分解质因数:

    [K=prod_{i=1}^M p_i^{t_i} ]

    那么构成一个(0)的代价就是对于分解得到的每一个(p_i),消耗(t_i)(p_i)

    然后对分解得到的每一个质因数求一下(N!)里含有多少个即可,这个套路很常见,每次加上(N/p_i),同时让(N=N/p_i)(N=0)即可,加入统计出的(N!)里含有(g_i)(p_i)

    [ans=min_{i=1}^M {lfloorfrac{g_i}{t_i} floor} ]

    (\)

    (Code)


    #include<cmath>
    #include<cstdio>
    #include<cctype>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define N 1000010
    #define R register
    #define inf 9000000000000000ll
    using namespace std;
    typedef long long ll;
    
    ll n,k,tmp,res,ans=inf,fac[N],cnt[N];
    
    int main(){
      scanf("%lld%lld",&n,&k);
      tmp=sqrt(k);
      for(R ll i=2;i<=tmp;++i)
        if(k%i==0){
          fac[++fac[0]]=i;
          while(k%i==0) ++cnt[fac[0]],k/=i;
        }
      if(k!=1) fac[++fac[0]]=k,cnt[fac[0]]=1;
      for(R int i=1;i<=fac[0];++i){
        tmp=n; res=0;
        while(tmp) res+=tmp/fac[i],tmp/=fac[i];
        ans=min(ans,res/cnt[i]);
      }
      printf("%lld
    ",ans);
      return 0;
    }
    
  • 相关阅读:
    codeforces-1139 (div2)
    codeforces-1140 (div2)
    codeforces-1141 (div3)
    第四届CCCC团体程序设计天梯赛 后记
    BZOJ 3674 可持久化并查集
    你能回答这些问题吗
    [JSOI2008]最大数
    关路灯
    愤怒的小鸟
    推销员
  • 原文地址:https://www.cnblogs.com/SGCollin/p/9741188.html
Copyright © 2011-2022 走看看