Codeforces Round #538 (Div. 2) C 数论 + 求b进制后缀零

https://codeforces.com/contest/1114/problem/C

题意

给你一个数n(<=1e8),要你求出n!在b进制下的后缀零个数(b<=1e12)

题解

  • a在b进制下的后缀零个数?

    (a=p_1^{x_1}*p_2^{x_2}*p_3^{x_3}...*p_n^{x_n}),
    (b=q_1^{y_1}*q_2^{y_2}*q_3^{y_3}...*q_n^{y_n})
    p,q为素因子,后缀零个数为min(floor((x_i/y_i)))

  • 求p在n!中的个数?

    求1~n有多少个数有(p),(p^2),(p^3),...,(p^k<n)

    for(i=0;i<p.size();i++){
        x=p[i];
        tp=0;
        while(x<=n){
            tp+=n/x;
            if(n*1.0/x>=p[i])x*=p[i];
            else break;
        }
        ans=min(tp/X[i],ans);
    }

代码

#include<bits/stdc++.h>
#define ll long long 
using namespace std;
ll n,b,i,ans=0,tp,x;
vector<ll>a;
ll X[100],sz,pr[1000005],num,vi[1000005];
void init(){
    for(ll i=2;i<=1e6;i++){
        if(!vi[i]){
            pr[num++]=i;
            for(ll j=0;j<num&&i*pr[j]<=1e6;j++){
                vi[pr[j]*i]=1;
                if(i%pr[j]==0)break;
            }
        }
    }
}
int main(){
    init();
    cin>>n>>b;tp=b;
    for(i=0;i<num;i++){
        if(tp%pr[i]==0){
            while(tp%pr[i]==0){
                tp/=pr[i];X[sz]++;
            }
            a.push_back(pr[i]);
            sz++;
        }
        if(tp==1)break;
    }
    if(tp>1){
        a.push_back(tp);
        X[sz]++;
    }
    ans=1e18;
    for(i=0;i<a.size();i++){
        x=a[i];
        tp=0;
        while(x<=n){
            tp+=n/x;
            if(n*1.0/x>=a[i])x*=a[i];
            else break;
        }
        ans=min(tp/X[i],ans);
    }
    cout<<ans;
}
原文地址:https://www.cnblogs.com/VIrtu0s0/p/10515987.html