Codeforces 1114C
-
题目
1114C -
题意
求 进制下的 末尾有多少 -
分析
首先要知道对于十进制下 有多少个末尾 , 能质因数分解为 ,那么末尾为 就是看 分解后有多少个 ,又因为 的个数大于 的个数,所以最终的答案看的是 的个数,计算5的贡献答案即为 .
通过以下函数计算void f(int x,int y) { if(x < y) return 0; else return x/y+(x/y,y); }
现在考虑 进制下的情况
- 分解 的质因数
- 计算答案并除以
,再取
:为什么答案不直接计算分解出的最大质因数,这样不就求出最少的个数了吗?
:这里要考虑到 的影响。
:为什么求 的时候要除以
:因为假设 是 ,那么分解质因数是 ,计算时计算了 的贡献,而实际上答案只要 这个数的贡献。因为只有 才能相乘在 进制下等于
-
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1600;
ll a,b;
ll c[N],m = 0,p[N];
void fj()
{
for(int i= 2;i<=sqrt(b);i++)
{
if(b % i== 0)
{
p[++m] = i,c[m] = 0;
while(b %i == 0) b/=i,c[m]++;
}
}
if(b > 1)
p[++m] = b,c[m] = 1;
}
ll cal(ll x,ll y)
{
if(x < y) return 0;
else return x/y+cal(x/y,y);
}
void solve()
{
ll minn=0x7fffffffffffffff;
fj();
for(int i= 1;i<=m;i++)
{
minn = min(minn,cal(a,p[i])/c[i]);
}
cout<<minn<<endl;
}
int main ()
{
cin>>a>>b;
solve();
return 0 ;
}
- 方法
质因数分解,题目分析 - 总结