zoukankan      html  css  js  c++  java
  • Codeforces #538.div2

    C

    给你n(<=1e18)和b(<=1e12),求出n!化为b进制后尾部0的数量

    由于n的范围较大,肯定不能算n!

    算一下就会发现尾部0的数量就等于n!能整除b的次数

    把b质因数分解

    n!能整除b的次数即为n!能整除b的因子的数目的最小值

    #include <bits/stdc++.h>
    using namespace std;
    #define LL long long
    LL prime[30000],co[30000];
    int cnt=0;
    void only(LL n)
    {
        LL i;
        cnt=0;
        for(i=2;i*i<=n;i++)
        {
            if(n%i==0)
            {
                prime[cnt]=i;
                while(n%i==0)
                {
                    n/=i;
                    co[cnt]++;
                }
                cnt++;
            }
        }
        if(n>1)
        {
            prime[cnt]=n;
            co[cnt]++;
            cnt++;
        }
    }
    
    int main()
    {
        LL n,b;
        cin>>n>>b;
        only(b);
        LL minres=1e18;
        for(int i=0;i<cnt;i++)
        {
            LL res=n/prime[i];
            double nn=(double)prime[i]*prime[i];
            while(nn<=n)
            {
                res+=(LL)n/nn;
                nn*=prime[i];
            }
            res/=co[i];
            if(res<minres)minres=res;
        }
        cout<<minres<<endl;
        return 0;
    }

    注意由于prime[i]较大,prime[i]*prime[i]会爆long long,爆掉之后可能乘积变小也可能会变负,所以必须转化为double

  • 相关阅读:
    Angular(一)
    go微服务系列(四)
    导包路径
    django导入环境变量 Please specify Django project root directory
    动手动脑三
    动手动脑二
    大柱
    日报
    验证码
    动手动脑
  • 原文地址:https://www.cnblogs.com/raincle/p/10397351.html
Copyright © 2011-2022 走看看