CodeForces - 1114C(Trailing Loves)

题意:给定 n 和 b ,求 n 的阶乘在 b 进制下末尾的 0 的个数。

分析:设  n!=x*b^k; 则 k 就是我们要求的答案,把 b 和 n! 写成质因数分解形式:

 b=p1^{a1}p2^{a2}...pi^{ai};

 n!=p1^{b1}p2^{b2}...pj^{bj};

则问题就变成了统计 n!中可以组成 b 的最小个数。求出 b 中每一个质因数 pi,并求出幂次数 ai,求出对应 n!中 pi 的幂次数 bi,则答案显而易见就是 min( bi / ai ) ; 

代码:

#include<cstdio>
#include<iostream>
#define inf 1e18
using namespace std;

typedef long long ll;

ll n,b,ans;

void solve(ll x,ll num)
{
	ll tmp=1,res=0;
	while(tmp<=n/x)    //防止溢出
	{
		tmp*=x;
        
        //先累加 1—n 中能被 x 整除的个数,然后累加 能被 x^2 整除的个数,依此 x^3...x^i
        //为什么这样算,因为,能被 x^i 整除的数肯定能被 x,x^2...x^(i-1) 整除,而前 i-1
        //次累加已经为这个数累加了 i-1 次,只要最后累加一次就够了!

		res+=n/tmp;  
	}
	ans=min(ans,res/num);
}

int main()
{
	ans=inf;
	scanf("%lld%lld",&n,&b);
	
    for(ll i=2;i*i<=b;i++)
    {
    	if(b%i==0)
    	{
    		ll cnt=0;
    		while(b%i==0) b/=i,cnt++;
    		solve(i,cnt);
		}	
	}
	if(b>1) solve(b,1);
	printf("%lld",ans);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值