约数之和

链接

AcWing_97 约数之和

题目描述

假设现在有两个自然数 A A A 和 B B B, S S S 是 A B A^B AB 的所有约数之和。

请你求出 S m o d 9901 S\bmod9901 Smod9901 的值是多少。

输入格式

在一行中输入用空格隔开的两个整数 A A A 和 B B B。

输出格式

输出一个整数,代表 S m o d 9901 S\bmod9901 Smod9901 的值。

数据范围

0 ≤ A , B ≤ 5 × 1 0 7 0≤A,B≤5×10^7 0≤A,B≤5×107

输入样例

2 3

输出样例

15

注意

A A A 和 B B B 不会同时为 0 0 0。

思路

由数论的知识可知,若将 A A A 分解质因数,可以表示为:
A = p 1 c 1 ∗ p 2 c 2 ∗ p 3 c 3 ∗ . . . ∗ p n c n A=p_1^{c_1}*p_2^{c_2}*p_3^{c_3}*...*p_n^{c_n} A=p1c1​​∗p2c2​​∗p3c3​​∗...∗pncn​​

那么, A B A^B AB 的约数之和则可以表示为:
( p 1 0 + p 1 1 + p 1 2 + . . . . . . p 1 c 1 ) ∗ . . . . . . ∗ ( p n 0 + p n 1 + p n 2 + ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ p n c n ) = ∏ i = 1 n ( ∑ j = 0 c i p i j ) (p_1^0+p_1^1+p_1^2+......p_1^{c_1})*......*(p_n^0+p_n^1+p_n^2+······p_n^{c_n})=\prod _{i=1}^{n}\left(\sum _{j=0}^{c_i}p_i^j\right) (p10​+p11​+p12​+......p1c1​​)∗......∗(pn0​+pn1​+pn2​+⋅⋅⋅⋅⋅⋅pncn​​)=i=1∏n​(j=0∑ci​​pij​)

由于答案 S S S 要对 9901 9901 9901 取模,所以求 ∑ j = 0 c i p i j \sum _{j=0}^{c_i}p_i^j ∑j=0ci​​pij​ 不能用等比数列求和公式,因为使用等比数列求和公式需要做除法,但 a m o d m b m o d m ≠ a b \frac{a \bmod m}{b \bmod m} ≠ \frac{a}{b} bmodmamodm​​=ba​。

所以我们只能用分治的方法求 ∑ j = 0 c i p i j \sum _{j=0}^{c_i}p_i^j ∑j=0ci​​pij​。

若 c i c_i ci​ 为奇数:
∑ j = 0 c i p i j = ( p i 0 + p i 1 + . . . + p i c i − 1 2 ) + ( p i c i + 1 2 + ⋅ ⋅ ⋅ + p i c i ) = 1 × ( p i 0 + p i 1 + . . . + p i c i − 1 2 ) + p i c i + 1 2 × ( p i 0 + p i 1 + . . . + p i c i − 1 2 ) = ( 1 + p i c i + 1 2 ) × ∑ j = 0 c i − 1 2 p i j \begin{array}{lcl} \sum _{j=0}^{c_i}p_i^j&=&(p_i^0+p_i^1+...+p_i^{\frac{c_i-1}{2}})+(p_i^{\frac{c_i+1}{2}}+···+p_i^{c_i})\\ &=&1 \times (p_i^0+p_i^1+...+p_i^{\frac{c_i-1}{2}}) + p_i^{\frac{c_i+1}{2}} \times (p_i^0+p_i^1+...+p_i^{\frac{c_i-1}{2}})\\ &=&(1+p_i^{\frac{c_i+1}{2}}) \times \sum _{j=0}^{\frac{c_i-1}{2}}p_i^j\\ \end{array} ∑j=0ci​​pij​​===​(pi0​+pi1​+...+pi2ci​−1​​)+(pi2ci​+1​​+⋅⋅⋅+pici​​)1×(pi0​+pi1​+...+pi2ci​−1​​)+pi2ci​+1​​×(pi0​+pi1​+...+pi2ci​−1​​)(1+pi2ci​+1​​)×∑j=02ci​−1​​pij​​

若 c i c_i ci​ 为偶数:
∑ j = 0 c i p i j = ( 1 + p i c i 2 ) × ∑ j = 0 c i 2 − 1 p i j \begin{array}{lcl} \sum _{j=0}^{c_i}p_i^j&=&(1+p_i^{\frac{c_i}{2}}) \times \sum _{j=0}^{\frac{c_i}{2}-1}p_i^j\\ \end{array} ∑j=0ci​​pij​​=​(1+pi2ci​​​)×∑j=02ci​​−1​pij​​

这样就可以对 ∑ j = 0 c i p i j \sum _{j=0}^{c_i}p_i^j ∑j=0ci​​pij​ 做取模运算了。

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std;
const long long mod=9901;
long long a,b,f[8001],g[8001],sum,pro,ans,aa,cnt;
long long fast_pow(long long m,long long n)
{long long ans=1;m=m%mod;while(n){if(n&1)ans=ans%mod*m%mod;m=m%mod*m%mod;n=n>>1;}return ans%mod;
}
long long fun(long long p,long long c)
{if(!c)return 1;else if(c&1)return (1+fast_pow(p,(c+1)>>1))*fun(p,(c-1)>>1)%mod;elsereturn ((1+fast_pow(p,c>>1))*fun(p,(c>>1)-1)+fast_pow(p,c))%mod;
}
int main()
{scanf("%d%d",&a,&b);aa=a;for(int i=2;i<=aa;i++){if(aa%i==0){cnt++;f[cnt]=i;while(aa%i==0){g[cnt]++;aa/=i;}g[cnt]*=b;}}ans=1;for(int i=1;i<=cnt;i++){sum=fun(f[i],g[i])%9901;ans=ans*sum%9901;}if(a)printf("%d",ans);elseprintf("0");return 0;
}

AcWing_97 约数之和相关推荐

  1. 《算法竞赛进阶指南》打卡-基本算法-AcWing 97. 约数之和:递归、快速幂

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 快速幂参考笔者的这篇博文: 算法刷题-数论-组合数.快速幂.逆元.递推求组合数.逆元求组合数 约数之和参考笔者的这篇博文: 算法刷题 ...

  2. 算法刷题-数论-试除法求约数、约数个数、约数之和、最大公约数(辗转相除法)

    文章目录 acwing869. 试除法求约数 acwing870. 约数个数 acwing871. 约数之和 acwing872. 最大公约数 acwing869. 试除法求约数 acwing869. ...

  3. 51NOD 1220 约数之和(杜教筛)

    1220 约数之和 推式子 ∑i=1n∑j=1nd(i,j)=∑i=1n∑j=1n∑x∣i∑y∣j(gcd(x,y)=1)xjy=∑d=1ndμ(d)∑i=1nd∑x∣iix∑j=1nd∑y∣jj=∑ ...

  4. ~~约数之和(附模板题)

    模板 如果 N = p1^c1 * p2^c2 * ... *pk^ck 约数个数: (c1 + 1) * (c2 + 1) * ... * (ck + 1) 约数之和: (p1^0 + p1^1 + ...

  5. 第F题 真约束之和(通解)古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为:  1+2+4+5+10+11+20+22+44+55+110=284

    古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为: 1+2+4+5+10+11+20+22+44+55+110=284. 而284的所有真约数为1.2.4.71. ...

  6. 约数之和 c语言,(c语法百题20)约数之和,约数之和

    (c语法百题20)约数之和,约数之和 知识点: 求约数的算法 for语句,if语句灵活运用. 内容: 键入一个自然数 ,求这个自然数的所有约数之和 输入说明: 一个整数 输出说明: 一个整数 输入样例 ...

  7. 真约数求法 c语言,数学:求一个数的真约数(因数)的个数及所有约数之和

    一. 我们知道,每个自然数(不包括0和1)都有2个以上的因数,因数最少的是质数(也叫素数),质数的因数是1和它本身.非质数的自然数也叫合数,它们都含有3个以上(含3个)的因数. 1.怎样求一个数有多少 ...

  8. POJ1845(约数之和)

    自闭的人的题解 POJ1845 约数之和 题目描述: 给你两个整数A.B,让你求出a^b中所有的约数的和膜上9901的值. 输入 : 两个正整数A,B 输出 : 一个正整数表示答案 样例: IN :2 ...

  9. 质因数 求约数 c语言,【初等数论】 求一个数有多少约数及所有约数之和、分解质因数...

    今天做题遇见,于是就搜了一下,于是就有了这篇文章.(其实我不知道原理....Orz)我觉得分解质因数的最优算法应该不是我这篇文章中的这个.....谁有好的算法可以给我说一下,谢谢. 1.有多少个约数: ...

最新文章

  1. Linux多线程的进阶理解
  2. [elixir观察] GenStage 与 Flow
  3. VC++之自定义消息
  4. NYOJ 158 省赛来了
  5. SAP Hybris Enterprise Commerce Platform ECP和SAP CRM架构比较
  6. android 智能指针的学习先看邓凡平的书扫盲 再看前面两片博客提升
  7. Google Guava MultiMaps
  8. 无法从“cstring”转换为“lpcstr”_U盘重装系统后,无法使用?
  9. linux子网掩码和ip计算,子网掩码的计算 - winglok的个人页面 - OSCHINA - 中文开源技术交流社区...
  10. MATLAB免疫算法与粒子群算法进行函数优化
  11. mq相关的面试突击笔记 大神公众号“石杉的架构笔记
  12. 项目管理包括哪些内容
  13. 重温计算机简史:从石头计数到计算机
  14. 基于量化交易回测的金融股票案例基础知识
  15. 手把手教你用frp内网穿透
  16. 小额信贷管理系统解决方案
  17. python读取webp格式图像
  18. FireFox必备插件(七)
  19. 阿里云企业邮箱代理商:foxmal邮件发送RCPT错误怎么办?
  20. 企业版和专业版的区别 mail:_阿里邮箱企业版免费与收费邮箱的区别有哪些

热门文章

  1. 软件测试面试题:解释什么是jmeter后置处理器?
  2. 存储卡插入电脑提示磁盘有写保护怎么办
  3. 实现发送手机短信验证码功能
  4. openssh远程系统登录
  5. 基于用户行为的视频聚类方案
  6. 【已解决】解决Win7安装VS2013/VS2015结束时报错“无法建立到信任根颁发机构的证书链”的问题
  7. android系统手机限制cpu频率让手机省电
  8. 我的世界服务器指令修复耐久,我的世界修复耐久的指令 | 手游网游页游攻略大全...
  9. 在微信的视频通话中将语音转成文字并显示在通过的界面中
  10. RS-485端口静电放电(ESD)保护器件CDSOT23-SM712国产替代