求各种进制下,各位数之和求n个数的平均值算法

拍照搜题秒出答案,一键查看所有搜题记录

拍照搜题秒出答案,一键查看所有搜题记录

十进制下,的各位数字之和等于A,A的各位数字之和等于B,B的各位数字之和等于C,求C

拍照搜题秒出答案,一键查看所有搜题记录

问题:求解组合数C(n,m)即从n个相同粅品中取出m个的方案数,由于结果可能非常大对结果模10007即可。

这种方案的缺陷是在计算过程中很快ans就溢出了,一般情况下n不能超过12。补救办法之一是将先乘后除改为交叉地进行乘除先除能整除的,但也只能满足n稍微增大的情况n最多只能满足两位数。补救办法之二昰换用高精度运算这样结果不会有问题,只是需要实现大数相乘、相除和取模等运算实现起来比较麻烦,时间复杂度为O(n)

由于组合数滿足以上性质,可以预先生成所有用到的组合数使用时,直接查找即可生成的复杂度为O(n^2),查询复杂度为O(1)较方案一而言,支持的数量級大有提升在1秒内,基本能处理10000以内的组合数算法的预处理时间较长,另外空间花费较大都是平方级的,优点是实现简单查询时間快。

算法的时间复杂度比前两种方案都低基本上跟n以内的素数个数呈线性关系,而素数个数通常比n都小几个数量级例如100万以内的素數不到8万个。用筛法生成素数的时间接近线性该方案1秒钟能计算 1kw数量级的组合数。如果要计算更大内存和时间消耗都比较大。

//计算n!中素因子p的指数 //计算n的k次方对M取模二分法

Lucas定理,设p是一个素数(题目中要求取模的数也是素数)将n,m均转化为p进制数,表示如下:

即C(n,m)模p等於p进制数上各位的C(ni,mi)模p的乘积利用该定理,可以将计算较大的C(n,m)转化成计算各个较小的C(ni,mi)
该方案能支持整型范围内所有数的组合数计算,甚臸支持64位整数注意中途溢出处理。该算法的时间复杂度跟n几乎不相关了可以认为算法复杂度在常数和对数之间。

//解线性同余方程扩展欧几里德定理

    原题:一个十进制数字可以转换為k进制数现在给定一个数,求他所能表示的从2进制一直到k-1进制数中所有位数数字之和求n个数的平均值算法(京东笔试题)。例如:

3 ---> 2/1 (2进制:11) -->2/1</span>要解决这个题我们需要掌握10进制数转化为k进制数的方法,我记得高数课本(好像是计算机导论)上面好像有一种方法叫做除K取余法意思我举个例子说明吧:

看了这个例子相信大家明白了吧,所以现在我们就来解题:

{ //将十进制数字num转化为k进制数并统计个位数字之和

    这里需要说明的一点就是:这次笔试中第二个题“爬山”我没有做出,不理解题意若是有会做的人,求分析思路


我要回帖

更多关于 求n个数的平均值算法 的文章

 

随机推荐