[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;
}

posted @ 2020-08-17 14:47  Jayun  阅读(111)  评论(0编辑  收藏  举报