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;
    }
    
  • 相关阅读:
    .net ORM架构列表
    C#向win32程序窗口中的文本框设置指定文本
    C#串口通信总结
    MPF配置文件参数管理
    WF牛人们的资源
    BDD初步
    DevExpress 汉化(简单、实用、快速)
    WPF中的命令简述(Command)
    Devexpress汉化资源
    Silverlight架构列表
  • 原文地址:https://www.cnblogs.com/SGCollin/p/9741188.html
Copyright © 2011-2022 走看看