題目:有兩個數字n,m,輸出最大的k使得m^k能被n!整除。
分析:數論。將m因式分解,統計每個素數因子的次數記為p(0),p(1),...;
再將n!因式分解,求出對應質因數的個數q(0),q(1),...;
则结果为:min(q(0)/p(0),q(1)/p(1),...);
統計n!素數因子p的個數為:n/p + n/p/p + ...(按余数分类即可求出p的所有倍数);
說明:注意不要使用while(scanf()!= EOF),会WA,╮(╯▽╰)╭。
#include <cstring>
#include <cstdio>
int visit[10001];
int prime[10001];
int main()
{
memset(visit, 0, sizeof(visit));
int count = 0;
for (int i = 2; i < 10001; ++ i)
if (!visit[i]) {
prime[count ++] = i;
for (int j = i*i; j < 10001; j += i)
visit[j] = 1;
}
int k, m, n;
scanf("%d",&k);
for (int t = 1; t <= k; ++ t){
scanf("%d%d",&m, &n);
int min = 0x3f3f3f3f;
for (int i = 0; m > 1 && i < count; ++ i) {
int size = 0;
while (m%prime[i] == 0) {
m /= prime[i];
++ size;
}
if (size) {
int now = n, max = 0;
while (now)
max += now /= prime[i];
if (min > max/size)
min = max/size;
}
}
printf("Case %d:\n",t);
if (min && min != 0x3f3f3f3f)
printf("%d\n",min);
else printf("Impossible to divide\n");
}
return 0;
}