您的位置:首页 > 其它

light oj1045 - Digits of Factorial (阶乘的位数,,运用对数)

2016-10-25 08:32 239 查看
      1045 - Digits of Factorial



 


PDF (English)StatisticsForum
Time Limit: 2 second(s)Memory Limit: 32 MB
Factorial of an integer isdefined 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, thefactorial 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) ofthe 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) andbase (2 ≤ base ≤ 1000). Both ofthese integers will be given in decimal.

Output

For each case of input you have to print the case number andthe digit(s) of factorial n in the given base.

Sample Input

Output for Sample Input

5

5 10

8 10

22 3

1000000 2

0 100

Case 1: 3

Case 2: 5

Case 3: 45

Case 4: 18488885

Case 5: 1

这题真的算的上是创新,,,

乍一看连给予X进制的阶乘都不会求还怎么求位数,,,,题目巧妙在可以跳过中间环节,,,,

联想10进制求位数时用log10(x)+1,,,如果从这个式子联想的话,x 进制的数字的sum位数应该是logx(sum);

这里只需要借助一下换底公式就可以跳过计算x阶乘的环节,,,,,还是需要思维+联想,,,

#include <iostream>

#include <cstdio>

#include <cstring>

#include <cmath>

using namespace std;

const int N = 1000010;

double f
;

int main()

{

    f[0]=0;

    for(int i=1;i<=N;i++)

    {

        f[i]=f[i-1]+log10(i*1.0);

    }

    int t, ncase=1;

    scanf("%d", &t);

    while(t--)

    {

        int n, base;

        scanf("%d %d", &n, &base);

        printf("Case %d: %d\n",ncase++,int(f
/log10(base*1.0))+1);

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: