hdu1452 因子和的积性函数

对于一个大于1正整数n可以分解质因数:n=p0^a0*p1^a1*p2^a2*p3^a3*…*pk^ak,
则由约数个数定理可知n的正约数有(a0+1)*(a₁+1)(a₂+1)(a₃+1)…(ak+1)个,
那么n的(a0+1)(a₁+1)(a₂+1)(a₃+1)…(ak+1)个正约数的和为
s(n)= (p0^0+p0^1+p0^2+…p0^a0)(p1^0+p1^1+p1^2+…p1^a1)(p2^0+p2^1+p2^2+…p2^a2)…(pk^0+pk^1+pk^2+…pk^ak)

约数和公式证明:

pk^ak 的约数为:1 , pk , pk^2 , pk^3 , ... ,pk^ak

实际上n的约数是在p0^a0、p1^a1、p2^a2、...、pk^ak每一个的约数中分别挑一个相乘得来

所以它们的和为 :

 s(n)=(p0^0+p0^1+p0^2+…p0^a0)(p1^0+p1^1+p1^2+…p1^a1)(p2^0+p2^1+p2^2+…p2^a2)…(pk^0+pk^1+pk^2+…pk^ak)


容易理解,若gcd(a,b)=1 ,则 s(a*b) = s(a) * s(b)

看: hdu1452 Happy 2004

计算因子和 s(2004^X) mod 29 ,

2004=2^2 *3 *167

2004^X=2^2X * 3^X *167^X

s(2004^X) ) = s(2^2X) * s(3^X) * s(167^X)

  = (2^0+2^1+2^2+...+2^2x) * (3^0+3^1+3^2+...+3^x) * (167^0+167^1+167^2+...+167^x) 

  =  (2^0+2^1+2^2+...+2^2x) * (3^0+3^1+3^2+...+3^x) * (22^0+22^1+22^2+...+22^x) ................. 有(167%29=22)

  = (2^(2X+1)-1)  *  ((3^(X+1)-1)/2)  *  ((22^(X+1)-1)/21)

怎么算(a/b)%p ? 设 (a/b)%p = y;

a/b = k*p + y ;

a = k*p*b + y*b ;

因为p>y,则p*b > y*b

所以 y*b = a % (p*b) 

所以 (a/b)%p = y = a%(p*b) / b 

#include<cstdio>
#include<cmath>
using namespace std;
int quick(int a,int b,int m){     //a^b%m
    int ans = 1,tmp = a;   
    while(b){
        if(b&1) {
            ans*=tmp;
            ans%=m;
        }
        tmp*=tmp; //低级错误,这里不应该是tmp*=a
        tmp%=m;
        b>>=1;
    }
    return ans;
}
int main(){
    int x,a1,a2,a3;
    while(scanf("%d",&x)!=EOF&&x){
        a1 = quick(2,2*x+1,29)-1;
        if(a1<0) a1+=29;

        a2 = quick(3,x+1,2*29)-1;
        if(a2<0) a2+=2*29;
        a2/=2;

        a3 = quick(22,x+1,21*29)-1;
        if(a3<0) a3+=21*29;
        a3/=21;
        printf("%d\n",a1*a2*a3%29);
    }
}


计算(a/b)%p的另一种方法:(转载自网络)

%运算法则 1. (a*b) %p= ( a%p) *(b%p)

%运算法则 2. (a/b) %p= ( a *b^(-1)%p) 除法的

s(2004^X)=2^(2X+1)-1* (3^(X+1)-1)/2  *(22^(X+1)-1)/21

(a*b)/c %M= a%M* b%M  * inv(c)

c*inv(c)=1 %M    模为1的所有数  invc)为最小可以被c整除的

inv(2)=15,  inv(21)=18    2*15=1 mod 29, 18*21=1 mod 29

s(2004^X)=((2^(2X+1)-1* (3^(X+1)-1)/2  *(22^(X+1)-1)/21mod 29

         =((2^(2X+1)-1* (3^(X+1)-1)*15 *(22^(X+1)-1)*18mod29

b^(-1) b的逆元素(%p)即上面的inv

2的逆元素是15  ,因为2*15=30 % 29=1 % 29

21的逆元素是18  ,因为21*18=378% 29 =1 % 29

因此

a=powi(2,2*x+1,29)-1% 29;

b=(powi(3,x+1,29)-1)*15 % 29;

c=(powi(22,x+1,29)-1)*18 % 29;

ans=a*b% 29*c % 29;

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值