How many zeros and how many digits?

Input: standard input

Output: standard output

Given a decimal integer number you will have to find out how many trailing zeros will be there in its factorial in a given number system and also you will have to find how many digits will its factorial have in a given number system? You can assume that for a bbased number system there are b different symbols 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 number N (a 20bit unsigned number) and a decimal number B (1<B<=800), which is the base of the number system you have to consider. As for example 5! = 120 (in decimal) but it is 78 in hexadecimal number system. 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 number have in the given number system and also how many digits will the factorial of that number have in that given number system. Separate these two numbers with a single space. You can be sure that the number of trailing zeros or the number of digits will not be greater than 2^31-1

Sample Input:

2 10
5 16
5 10

 

Sample Output:

0 1
0 2
1 3

题目大意:求n!的bas进制m的位数和后面0的个数。

解题思路:1,求位数:当base为10时,10^(m-1) < n < 10 ^m,两边同去log10,m - 1 < log10(n) < m,n 的位数为(m-1).

PS:<1>log10(a * b) = log10(a) + log10(b)        求n!的位数时。

<2>logb(a) = log c(a) / log c(b)转换进制位数。

<3>浮点数的精度问题,求位数需要用到log函数,log函数的计算精度有误差。所以 最后需要对和加一个1e-9再floor才能过。

2,将n!分解成质因子,储存在数组里面,在对bas做多次分解,直到数组中的元素小于0.

#include<stdio.h>
#include<string.h>
#include<math.h> #define N 10000
int num[N]; int count_digit(int n, int bas){
double sum = 0;
for (int i = 1; i <= n; i++)
sum += log10(i);
sum = sum / log10(bas);
return floor(sum + 1e-9) + 1;
} int count_zore(int n, int bas){
memset(num, 0, sizeof(num)); for (int i = 2; i <= n; i++){
int g = i;
for (int j = 2; j <= g && j <= bas; j++){
while (g % j == 0){
num[j]++;
g = g / j;
}
}
} int cnt = 0; while (1){
int g = bas; for (int j = 2; j <= bas; j++){
while (g % j == 0){
if (num[j] > 0)
num[j]--;
else
goto out;
g = g / j;
}
}
cnt++;
}
out:
return cnt;
} int main(){
int n, bas;
while (scanf("%d%d", &n, &bas) != EOF){
int ndigit = count_digit(n, bas);
int nzore = count_zore(n, bas);
printf("%d %d\n", nzore, ndigit);
}
return 0;
}

uva 10061 How many zero's and how many digits ?的更多相关文章

  1. UVA 10061 How many zero's and how many digits ? (m进制,阶乘位数,阶乘后缀0)

    题意: 给出两个数字a和b,求a的阶乘转换成b进制后,输出 (1)后缀中有多少个连续的0? (2)数a的b进制表示法中有多少位? 思路:逐个问题解决. 设a!=k.  k暂时不用直接转成b进制. (1 ...

  2. How many zero's and how many digits ? UVA - 10061

    Given a decimal integer number you will have to find out how many trailing zeros will be there in it ...

  3. Uva 10061 进制问题

    题目大意:让求n!在base进制下的位数以及末尾0的连续个数. 多少位 log_{10}256=log_{10}210^2+log_{10}510^1+log_{10}6*10^0 可以发现,只和最高 ...

  4. UVA - 10061 How many zero&#39;s and how many digits ?

    n!=x*b^y, 当x为正整数时,最大的y就是n!末尾0的个数了, 把n,b分别拆成素因子相乘的形式: 比如, n=5,b=16 n=5,b=2^4, 非常明显,末尾0的个数为0 10进制时,n!= ...

  5. uva 10061(数学)

    题解:题目要在b进制下输出的是一个数字阶乘后有多少个零,然后输出一共同拥有多少位.首先计算位数,log(n)/log(b) + 1就是n在b进制下有多少位,而log有个公式就是log(M×N) = l ...

  6. UVA题目分类

    题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics ...

  7. n!在k进制下的后缀0

    问n! 转化成k进制后的位数和尾数的0的个数.[UVA 10061 How many zeros and how many digits?] Given a decimal integer numbe ...

  8. 2003-Can't connect to mysql server on localhost (10061)

    mysql数据库出现2003-Can't connect to mysql server on localhost (10061)问题 解决办法:查看wampserver服务器是否启动,如果没有启动启 ...

  9. VNC connect:Connection refused(10061)

    在Windows机器上使用VNC Viewer访问Linux服务器,有时候会遇到"connect:Connection refused(10061)"这个错误,导致这个错误出现的原 ...

随机推荐

  1. C++ 知识点1

    typedef的陷阱 严格来说typedef并不是定义别名,而是定义类型,比如typedef int a;按照大部分书本说来,就是把a看做int,这种说法初学看来是正确的,也易于理解,但是遇到type ...

  2. 手机网页中的hover效果实现

    js文件 function mouseout(obj) { var className ="hover"; var _ecname = obj.className; if (_ec ...

  3. java学习笔记 (6) —— 文件上传

    1.新建upload.jsp <%@ page language="java" import="java.util.*" pageEncoding=&qu ...

  4. js文本框失去焦点事件与按钮单击事件的冲突问题

    <input type="text" id="txt" name="txt"/> <input type="bu ...

  5. 面试题:获取大量数据中某一条的index

    提问: 群里分享了一个面试题:页面里有很多条数据,怎么知道这条数据的index,并且不使用循环? 分析: 如果在数组里,直接用indexOf,但对于对象会比较麻烦. 在页面上,不使用循环的话,可以用定 ...

  6. Python新手学习基础之循环语句——While循环

    while循环 上一节的条件语句实际上只能执行一次,如果要反复的判断执行一些事件要怎么办? 这个时候就需要靠while.for等循环语句了. 我们先来认识下while循环,何为while循环?就是在某 ...

  7. forEach遍历对象数组案例

    <script> var users = [ {name:'name1',age:21}, {name:'name2',age:22}, {name:'name3',age:23} ]; ...

  8. subTree

    struct Tree() { int val; Tree *left, *right; Tree(int a): val(a), left(NULL), right(NULL){} } bool h ...

  9. js深入研究之Person类案例

    <script type="text/javascript"> /* 定义一个Person类 */ function Person(name, age) { this. ...

  10. One手动玩转

    <preface p2 by Ruiy,我就在开头简单奇葩两句!> 老周被查,涉及到政治问题,我先就不聊了,但Ruiy叹那,都查到七*务了,土党唱哪一出! 能基本玩转OpenNebula都 ...