Factorial of an integer is defined by the following function
f(0) = 1
f(n) = f(n - 1) * n, if(n > 0)
So, factorial of 5 is 120. But in different bases, the factorial may be different. For example, factorial of 5 in base 8 is 170.
In this problem, you have to find the number of digit(s) of the factorial of an integer in a certain base.
Input
Input starts with an integer T (≤ 50000)
, denoting the number of test cases.
Each case begins with two integers n (0 ≤ n ≤ 106)
and base (2 ≤ base ≤ 1000)
. Both of these integers will be given in decimal.
Output
For each case of input you have to print the case number and the digit(s) of factorial n in the given base.
Sample Input
5
5 10
8 10
22 3
1000000 2
0 100
Output for Sample Input
Case 1: 3
Case 2: 5
Case 3: 45
Case 4: 18488885
Case 5: 1
题目大意就是问N
的阶乘在m
进制下的位数。
对于这个题直接就是答案可能直接就出来了$int(log_m(n*(n-1)*(n-2)*(n-3)*...*2*1) + 1)$
但是由于测试数据样例过多,所以每次从1到n循环一遍代价会很大,所以直接打表1-1000000, 然后最后在除以$log(m)$
代码如下:
#include<bits/stdc++.h>
using namespace std;
vector<double> res(1000007);
void init()
{
double sum = 0;
for(int i=1; i<=1000000; ++ i)
{
sum += log(i);
res[i] = sum;
}
}
void solve(int cases)
{
int n, m;
scanf("%d%d", &n, &m);
if(n == 0){
printf("Case %d: %d
", cases, 1);
return;
}
printf("Case %d: %d
", cases, int(res[n] / log(m) + 1));
}
int main()
{
//ios::sync_with_stdio(false);
init();
int t;
scanf("%d", &t);
for(int i=1; i<=t; ++ i)
solve(i);
return 0;
}