所有因数之和 (题目来源:编程爱好者论坛)

 

所有因数之和   (题目来源:编程爱好者论坛)

第一题:
时间限制:1s
输入2个数字n,s。求数字n的所有因数之和除以s的余数。
 

比如输入
6 5 
6
的因数有1,2,3,6,因数之和为12,因为12除以5的余数为

于是输出2
 

假设n,s都不超过5000000

 

分析:

公式:N可分解为a^m*b^n*c^p……

那末N的所有正因数和为

(1+a+a^2+……+a^m)*(1+b+b^2+……+b^n)*(1+c+c^2+……+c^p)……

简略证明如下:由乘法法则可知,上述括号的连乘积为从所有括号中各取一个相乘,这样就可以保证它包含所有因数

稍微举个简单的例子更好理解:216=2^3*3^3 那末216的所有正因数和即为

(1+2+4+8)*(1+3+9+27)

详细分析下为什么这里要size >=sqrt(5000000)

如果不筛选到sqrt50000000),那么一旦给出5000000内的大于已经筛选出的素数的幂次。这样就会把这个数当作一个素数,但是事实不是,而是一个比较大的素数的幂次。故至少要筛选到sqrt5000000)。

参考代码:size=sqrt5000000

 

 

  

 

 

 

第二题:
输入3个数字n, m, s。求数字nm次方的所有因数之和除以m的余数。 
比如输入
6 2 5 
6^2=36 
36
的因数有1,2,3,4,6,9,12,18,36,因数之和为
91 
91
除以5的余数为1,所以输出1

假设n, m, s都不超过5000000 
这里规定这个s一直是9901  这样好做点。
POJ 1845

 

这个题目比上面的稍微复杂点。知道了a=p1^m1*p2^m2……

那么给出了a^b=p1^(m1*b)*p2^(m2*b)……指数都乘以了b就行

那么a^b的所有因数和=(1+p1^1+p1^2+……p1^(m1*b))*(1+p2^2+……p2^(m2*b))*……

一样吧。只是这个数一大项数很多,而且乘的也很多,只要解决加快项数的运算就行了。

还有就是p2^(m2*b)可能超出int 也超出__int64long long 不要怕 这里有个取余嘛

一边算一边取余就是了。

二分法in乘方

如何计算a^n

1)计算a*a*a**a*a*a,需要计算n-1次乘法,时间复杂度O(n)

2)考虑实例a^4,计算b=a*a,再算c=b*b,则c=a^4,但是只用了两次乘法,效率提高。比如a^9=a*(a^4)*(a^4),只需用4次乘法,一般的,a^n时间复杂度为O(logn)

用于快速算出乘数。

项数也可以用同样方法,二分怎么二分呢?是不是一下子看不出来??

式子都是等比数列吧,项数有奇项与偶项,分开考虑就行了。

首先,偶项:

1+p    1+p+p^2+p^3  1+p+p^2+p^3+p^4+p^5 ……

这些都是偶项的。而且都是后者是前者的两倍,二分的模型来了。

X1=1+p

X2=1+p+p^2(1+p)=(1+p)(1+p^2)   X3=1+p+p^2+p^3+p^4+p^5+p^6+p^7=1+p+p^2(1+p)+p^4+p^5+p^6+p^7=(1+p)*(1+p^2)+p^4(1+p)*(1+p^2)=

(1+p)*(1+p^2)*(1+p^4)

所以是:X3=(X2*(1+P^(2^3/2))=(X1*(1+p^(2^2/2))*(1+p^(2^3/2))  也就是((1+exp(p,k/2))*t)

exp(p,k/2)其实就是算出P^(2^3/2) 这样的。

 

现在,奇项:

X1 =1    项数 1

X2=1+p+p^2 =X1+p^(3/2)*(1+p*X1)   项数 1*2+1

X3=1+p+p^2+p^3+p^4+p^5+p^6=1+p+p^2+p^3*(1+p*(1+p+p^2))=X2+p^(7/2)*(1+p*X2)  项数 :(1*2+1*2+1  前面的 蓝色字体的7就是项数   这个对应式子:(t+exp(p,k/2)*(1+p*t))

exp(p,k/2):相当于p^(7/2)

t:就相当于X

 

相当清楚了吧。。。。。。

 

完整参考代码://参考哦,不保证没有BUG ~~

//在 雨中飞燕 那里做了下题目 又有所收获,视乎在统计

a=p1^m1*p2^m2......   里的m1的时候可以优化。可以想起判断是否是素数只要看小于sqrt(n) 

题目是这样的:

输入n(1 <= n <= 1e9),有多组测试数据:
616
27

输出:
616 = 2^3 * 7 * 11
27 = 3^3
(注意输出空格,但行末不要有空格)

难度:for beginner
参考代码:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

helihui123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值