Given a decimal integer number you will have to find out how many trailing zeros will be there in itsfactorial in a given number system and also you will have to find how many digits will its factorial havein a given number system? You can assume that for a b based number system there are b differentsymbols to denote values ranging from 0 . . . b − 1.
Input
There will be several lines of input. Each line makes a block. Each line will contain a decimal numberN (a 20bit unsigned number) and a decimal number B (1 < B ≤ 800), which is the base of the numbersystem you have to consider. As for example 5! = 120 (in decimal) but it is 78 in hexadecimal numbersystem. So in Hexadecimal 5! has no trailing zeros.
Output
For each line of input output in a single line how many trailing zeros will the factorial of that numberhave in the given number system and also how many digits will the factorial of that number have inthat given number system. Separate these two numbers with a single space. You can be sure that thenumber of trailing zeros or the number of digits will not be greater than 231 − 1.
Sample Input
2 10
5 16
5 10
Sample Output
0 1
0 2
1 3
题目描述:求N!在b进制下末尾0个数以及总位数。求总位数时注意精度。
/*
PROG: UVa10061
*/
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef pair<int, int> ii;
typedef vector<ii> vii;
int main(void) {
int N, B;
while (scanf("%d%d", &N, &B)==2) {
vii fact;
int b = B;
for (int i = 2; b != 1; ++i) {
if (b%i) continue;
int cnt = 0;
while (b%i==0) ++cnt, b /= i;
fact.push_back(make_pair(i, cnt));
}
int M = 100000000;
for (auto it = fact.begin(); it != fact.end(); ++it) {
int m = it->first;
int cnt = 0;
while (1) {
int tmp = N/m;
if (tmp == 0) break;
cnt += tmp;
m *= it->first;
}
cnt /= it->second;
M = min(M, cnt);
}
printf("%d ", M);
double sum = 0.0;
for (int i = 2; i <= N; ++i)
sum += log(i);
sum /= log(B);
printf("%d\n", 1+(int)(sum+1E-8)); //精度
}
return 0;
}