首页 > 其他 > 详细

求一个数的阶乘在 m 进制下末尾 0 的个数

时间:2019-02-11 20:37:06      阅读:329      评论:0      收藏:0      [点我收藏+]

技术分享图片

技术分享图片

题意 :

  求一个数 n 的阶层在 m 进制下末尾 0 的个数

思路分析 :

  如果是 10 进制地话我们是很容易知道怎么做的,数一下其对 5 约数地个数即可,但是换成 m 进制的话就需要先将 m 分解质因数,然后然后看 n! 下因数个数最少的是几个,即是最终答案。

代码示例 :

#define ll long long
const ll maxn = 1e6+5;
const ll mod = 1e9+7;
const double eps = 1e-9;
const double pi = acos(-1.0);
const ll inf = 0x3f3f3f3f;

ll n, b;
ll prime[maxn];
vector<ll>ve;

void init(){
    for(ll i = 2; i <= 1000000; i++){
        if (!prime[i]){
            ve.push_back(i);
            for(ll j = 2*i; j <= 1000000; j += i){
                prime[j] = 1;
            }
        }
    }
}
ll get(ll pp, ll x){
    ll res = 0;
    
    while(x){
        res += x/pp;
        x /= pp;
    }
    return res;
}

ll cnt[maxn], num[maxn];
void solve(){
    ll f = b;
    for(ll i = 0; i < ve.size(); i++){
        if (f == 1) break;
        while(f%ve[i] == 0){
            cnt[ve[i]]++;
            f /= ve[i];
        }        
    }
    for(ll i = 0; i < ve.size(); i++){
        if (cnt[ve[i]]){
            num[ve[i]] = get(ve[i], n);
        }
    }
    ll ans = 1e18+10;
    if (f != 1) ans = min(ans, get(f, n));
    for(ll i = 0; i < ve.size(); i++){
        if (cnt[ve[i]]){
            ans = min(ans, num[ve[i]]/cnt[ve[i]]);
        }
    }
    cout << ans << endl;
}

int main() {
    //freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    
    cin >> n >> b;
    init();
    solve();
    return 0;
}

 

求一个数的阶乘在 m 进制下末尾 0 的个数

原文:https://www.cnblogs.com/ccut-ry/p/10363066.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!