AcWing_97 约数之和
约数之和
链接
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∑cipij)
由于答案 S S S 要对 9901 9901 9901 取模,所以求 ∑ j = 0 c i p i j \sum _{j=0}^{c_i}p_i^j ∑j=0cipij 不能用等比数列求和公式,因为使用等比数列求和公式需要做除法,但 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=0cipij。
若 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=0cipij===(pi0+pi1+...+pi2ci−1)+(pi2ci+1+⋅⋅⋅+pici)1×(pi0+pi1+...+pi2ci−1)+pi2ci+1×(pi0+pi1+...+pi2ci−1)(1+pi2ci+1)×∑j=02ci−1pij
若 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=0cipij=(1+pi2ci)×∑j=02ci−1pij
这样就可以对 ∑ j = 0 c i p i j \sum _{j=0}^{c_i}p_i^j ∑j=0cipij 做取模运算了。
代码
#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 约数之和相关推荐
- 《算法竞赛进阶指南》打卡-基本算法-AcWing 97. 约数之和:递归、快速幂
文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 快速幂参考笔者的这篇博文: 算法刷题-数论-组合数.快速幂.逆元.递推求组合数.逆元求组合数 约数之和参考笔者的这篇博文: 算法刷题 ...
- 算法刷题-数论-试除法求约数、约数个数、约数之和、最大公约数(辗转相除法)
文章目录 acwing869. 试除法求约数 acwing870. 约数个数 acwing871. 约数之和 acwing872. 最大公约数 acwing869. 试除法求约数 acwing869. ...
- 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=∑ ...
- ~~约数之和(附模板题)
模板 如果 N = p1^c1 * p2^c2 * ... *pk^ck 约数个数: (c1 + 1) * (c2 + 1) * ... * (ck + 1) 约数之和: (p1^0 + p1^1 + ...
- 第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. ...
- 约数之和 c语言,(c语法百题20)约数之和,约数之和
(c语法百题20)约数之和,约数之和 知识点: 求约数的算法 for语句,if语句灵活运用. 内容: 键入一个自然数 ,求这个自然数的所有约数之和 输入说明: 一个整数 输出说明: 一个整数 输入样例 ...
- 真约数求法 c语言,数学:求一个数的真约数(因数)的个数及所有约数之和
一. 我们知道,每个自然数(不包括0和1)都有2个以上的因数,因数最少的是质数(也叫素数),质数的因数是1和它本身.非质数的自然数也叫合数,它们都含有3个以上(含3个)的因数. 1.怎样求一个数有多少 ...
- POJ1845(约数之和)
自闭的人的题解 POJ1845 约数之和 题目描述: 给你两个整数A.B,让你求出a^b中所有的约数的和膜上9901的值. 输入 : 两个正整数A,B 输出 : 一个正整数表示答案 样例: IN :2 ...
- 质因数 求约数 c语言,【初等数论】 求一个数有多少约数及所有约数之和、分解质因数...
今天做题遇见,于是就搜了一下,于是就有了这篇文章.(其实我不知道原理....Orz)我觉得分解质因数的最优算法应该不是我这篇文章中的这个.....谁有好的算法可以给我说一下,谢谢. 1.有多少个约数: ...
最新文章
- Linux多线程的进阶理解
- [elixir观察] GenStage 与 Flow
- VC++之自定义消息
- NYOJ 158 省赛来了
- SAP Hybris Enterprise Commerce Platform ECP和SAP CRM架构比较
- android 智能指针的学习先看邓凡平的书扫盲 再看前面两片博客提升
- Google Guava MultiMaps
- 无法从“cstring”转换为“lpcstr”_U盘重装系统后,无法使用?
- linux子网掩码和ip计算,子网掩码的计算 - winglok的个人页面 - OSCHINA - 中文开源技术交流社区...
- MATLAB免疫算法与粒子群算法进行函数优化
- mq相关的面试突击笔记 大神公众号“石杉的架构笔记
- 项目管理包括哪些内容
- 重温计算机简史:从石头计数到计算机
- 基于量化交易回测的金融股票案例基础知识
- 手把手教你用frp内网穿透
- 小额信贷管理系统解决方案
- python读取webp格式图像
- FireFox必备插件(七)
- 阿里云企业邮箱代理商:foxmal邮件发送RCPT错误怎么办?
- 企业版和专业版的区别 mail:_阿里邮箱企业版免费与收费邮箱的区别有哪些
热门文章
- 软件测试面试题:解释什么是jmeter后置处理器?
- 存储卡插入电脑提示磁盘有写保护怎么办
- 实现发送手机短信验证码功能
- openssh远程系统登录
- 基于用户行为的视频聚类方案
- 【已解决】解决Win7安装VS2013/VS2015结束时报错“无法建立到信任根颁发机构的证书链”的问题
- android系统手机限制cpu频率让手机省电
- 我的世界服务器指令修复耐久,我的世界修复耐久的指令 | 手游网游页游攻略大全...
- 在微信的视频通话中将语音转成文字并显示在通过的界面中
- RS-485端口静电放电(ESD)保护器件CDSOT23-SM712国产替代