[GDKOI2014] 阶乘
题目大意:
求 \(n!\) 在 \(base\) 进制下末尾有多少个零。
正文:
在 \(base\) 进制下某位到了 \(base\) 就进一,也就是说分解 \(base\) 的质因子,然后各个质因子匹配,由于匹配时,就算某个质因子再多,若其它质因子为零那最后的价值也只能为零,所以每个质因子的价值都取最小值。
代码:
void init_()
{
for (int i = 2; i <= N - 10; i++)
{
if(!vis[i]) {pri[++cnt] = i;}
for (int j = 1; j <= cnt && i * pri[j] <= N - 10; j++)
{
vis[i * pri[j]] = 1;
if(!(i % pri[j])) break;
}
}
}
int main()
{
// freopen(".out", "w", stdout);
init_();
for (scanf("%d", &t); t--; )
{
ans = 4e18;
scanf ("%lld%lld", &n, &base);
int i;
for (int j = 1; j <= cnt && pri[j] <= base; j++)
{
if(!(base - 1)) break;
if(base % pri[j]) continue;
ll tot = 0, num = 0;
for (; !(base % pri[j]); base /= pri[j], tot++);
for (ll k = n; k >= pri[j];)
k /= pri[j], num += k;
ans = min(ans, num / tot);
}
if(base - 1)
{
ll num = 0;
for (ll k = n; k >= base;)
k /= base, num += k;
ans = min(ans, num);
}
printf("%lld\n", ans);
}
return 0;
}