题意:

  给出两个数字a和b,求a的阶乘转换成b进制后,输出

  (1)后缀中有多少个连续的0?  

  (2)数a的b进制表示法中有多少位?

思路:逐个问题解决。

  设a!=k。  k暂时不用直接转成b进制。

(1)阶乘后缀0问题。先看这个十进制后缀0的例子:http://www.cnblogs.com/xcw0754/p/4604473.html

  解法差不多,稍变化。 首先将b分解成若干质数(比如8={2*2*2})保存在一个集合A中(注意自然数的质数分解是唯一的),只要有一个序列A就能构成一个0,因为满b就进位,b可以表示成10,表示一个1*b+0。那么我们需要知道k中究竟有多少个集合A。将k也质数分解成集合B,在集合B中每次减去一个A,每成功减掉1个A就有1个后缀0。

  直接求a!不是会爆吗?是的。将k进行质数分解和将{1~a}进行质数分解是一样的。那么就遍历[1,a]逐个进行分解,注意大于b的质数就不用去求了,其不可能用来组成b的。求完的质数的集合B应该是2有几个,3有几个,5有几个,7有几个...。如果集合A中需要4个2,那就看B中有多少个2,每两个2就可以组成一个后缀0,如果B中有5个2,那么就有2个0啦。

  总之,这步需要将b质数分解成A,将[1,a]质数分解成集合B,再看B中有多少个A。

(2)阶乘的位数问题。

  先举个例子: 一个三位数n满足102 <= n < 103

  那么他的位数w 满足 w = log103 = 3。 因此只要求lgn 向下取整 +1就是位数后因为阶乘比如5阶乘的话是5 * 4 * 3 * 2 * 1。他的位数就满足lg5 * 4 * 3 * 2 * 1 = lg5 + lg4 + lg3 + lg2 + lg1 这里用相加的就不会超过数字上限。

  当然这是十进制下得。如果是m进制下,就把log10n 换成logm就可以了。用高中知识:logm(n)的表示方法是 lgn / lgm。 这里有个double向下取整精度的问题要注意:转换成int时候,要floor(算出来的位数 + 1e-9) + 1.    注意:1e-9不要用变量存起来。

  最后得出位数的计算方式为:floor( logmn + logm(n - 1) + ...+ logm1 + 1e-9) + 1.红色部分就是所要算的主要数字,用一个循环累加即可。

 #include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N=;
int has[]; //哈希
int need[]; //进制的分解 int second(int a,int b) //总位数
{
double tmp=0.0;
for(int i=; i<=a; i++) tmp+=log10(i);
if(b!=) tmp/=log10(b); //转进制,10没必要转
return floor(tmp + 1e-)+;
} int first(int a,int b) //后缀0个数
{
memset(has,,sizeof(has));
memset(need,,sizeof(need));
for(int i=; i<=a; i++) //先分解阶乘中每个数
{
int t=i;
for(int j=; j<=t&&j<=b; j++) //质数为j
{
while(t%j==) //能被j整除的,全部除掉
{
has[j]++;
t/=j;
}
}
}
int t=b;
for(int i=; i<=b; i++) //进制b进行分解
{
while(t%i==)
{
need[i]++; //需要质数的个数记录起来
t/=i;
}
} int cnt=N;
for(int i=; i<=b; i++)
if(need[i]>) cnt=min(cnt,has[i]/need[i]); //木桶原理,最低的一块木板起作用
return (cnt>=N?:cnt);
} int main()
{
//freopen("e://input.txt", "r", stdin);
int a, b;
while(~scanf("%d%d",&a,&b))
printf("%d %d\n", first(a,b), second(a,b));
return ;
} AC代码

AC代码

UVA 10061 How many zero's and how many digits ? (m进制,阶乘位数,阶乘后缀0)的更多相关文章

  1. uva 10061 How many zero's and how many digits ?

    How many zeros and how many digits? Input: standard input Output: standard output Given a decimal in ...

  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 1103 古代象形符号(dfs求连通块, floodfill, 进制转换)

    题意: 给定一个H行W列的字符矩阵(H<200, W < 50), 输入的是一个十六进制字符, 代表一行四个相邻的二进制, 1代表像素, 0代表没有像素. 然后要求判断输入的是以下哪些图形 ...

  7. UVA 11464 偶数矩阵(递推 | 进制)

    题目链接:https://vjudge.net/problem/UVA-11464 一道比较好的题目. 思路如下: 如果我们枚举每一个数字“变”还是“不变”,那么需要枚举$2^{255}$种情况,很显 ...

  8. UVA题目分类

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

  9. 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。

    这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...

随机推荐

  1. Codeforces 414C Mashmokh and Reverse Operation

    题意:给你2^n个数,每次操作将其分成2^k份,对于每一份内部的数进行翻转,每次操作完后输出操作后的2^n个数的逆序数. 解法:2^n个数,可以联想到建立一棵二叉树的东西,比如  2,1,4,3就可以 ...

  2. POJ 1679 The Unique MST(次小生成树)

    题意:求解最小生成树的权值是否唯一,即要我们求次小生成树的权值两种方法求最小生成树,一种用prim算法, 一种用kruskal算法 一:用prim算法 对于给定的图,我们可以证明,次小生成树可以由最小 ...

  3. iOS-CAShapelayer

    1.CAShapeLayer继承至CALayer,可以使用CALayer的所有属性值2.CAShapeLayer需要与贝塞尔曲线配合使用才有意义3.使用CAShapeLayer与贝塞尔曲线可以实现不在 ...

  4. **app后端设计(10)--数据增量更新(省流量)

    在新浪微博的app中,从别的页面进入主页,在没有网络的情况下,首页中的已经收到的微博还是能显示的,这显然是把相关的数据存储在app本地. 使用数据的app本地存储,能减少网络的流量,同时极大提高了用户 ...

  5. 消除ComponentOne(C1StudioNet_2013v2) 的注册提示

     以后大家如果遇到还有提示,在License文件里添加:C1.Win.C1Command.C1OutBar, C1.Win.C1Command.4, Version=4.0.20132.19568,  ...

  6. SQL注入攻击

    SQL注入攻击是黑客对数据库进行攻击的常用手段之一.随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候, ...

  7. mysql新建用户本地无法登录

    mysql新建用户本地无法登录 MySQLDebianGoogleAccess  出此是用mysql,因为root权限过高,所以新建一用户appadmin,权限仅为要用到的数据库.创建语句如下:gra ...

  8. onCreateOptionsMenu 和 onPrepareOptionsMenu 的区别

    onCreateOptionsMenu 第一次创建时调用 onPrepareOptionsMenu 运行时每次点击菜单按钮时都会调用这个函数,可以动态改变菜单项 public boolean onPr ...

  9. MAC终端配色Solarized

    MAC终端配色Solarized $ git clone git://github.com/altercation/solarized.git 在 solarized/osx-terminal.app ...

  10. How to configure Spring facet in IntelliJ IDEA

    遇到了这个问题,稀里糊涂的就给搞定了,在stackoverfolw上看到了相同的问题,直接拷贝下来吧 Spring Configuration Check Unmapped Spring config ...