UVA - 10061 Myacm Triangles
题目大意:给出 N,B。求 N!在 B 进制下末尾有多少个 0 和有多少位。
解题思路:这题百度了 和 看同学的解了好久 这题分成2个问题 首先数 有多少位 将N 转换成b进制后有多少有 b的M-1次方 < N < b的m次方。 两边同时 取logb 得到 logN <= m ,所以对于N! 就有 log1+log2+log3+….logN <= m 求出m就是位数
然后数求尾数 只要凑这个数中有 多少个 质因数 可以配成 b进制 比如 10进制 看有多少个 2*5 就可以了
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
int zero(int n, int b) {
int p[300];
int q[300];
int o[300];
memset(o, 0, sizeof(o));
memset (q, 0, sizeof(q));
int t = 0;
for (int i = 2; b > 1 && i <= b; i++) {
while ( b % i == 0) {
p[t] = i;
if ( p[t] == p[t-1] ) {
t--;
o[t]++;
}
t++;
b = b/i;
}
}
long long int a = 1;
int s = 0;
for (int i = 2; i <= n; i++) {
a = i;
for (int j = 0; j < t; j++) {
while (a % p[j] == 0 && a) {
q[j]++;
a = a / p[j];
}
}
}
int sum = 999999999;
for (int i = 0; i < t; i++)
sum = min(sum,q[i]/(o[i]+1));
return sum;
}
int space(int n, int b) {
double s = 0.000000000;
for (int i = 1; i <= n; i++)
s = s +log(i+0.0);
s = s / log(b+0.0)+1e-9;
int m = s;
if (m < s) m++;
return m;
}
int main() {
int N,B;
while (scanf("%d%d", &N, &B) != EOF) {
printf("%d %d\n",zero(N,B), space(N,B));
}
}