【ACWing】97. 约数之和
题目地址:
https://www.acwing.com/problem/content/99/
假设现在有两个自然数 a a a和 a a a, s s s是 a b a^b ab的所有约数之和。请你求出 s m o d 9901 s\mod9901 smod9901的值是多少。
输入格式:
在一行中输入用空格隔开的两个整数 a a a和 b b b。
输出格式:
输出一个整数,代表 s m o d 9901 s\mod9901 smod9901的值。
数据范围:
0 ≤ a , b ≤ 5 × 1 0 7 , a + b > 0 0≤a,b≤5×10^7, a+b>0 0≤a,b≤5×107,a+b>0
约数之和有公式,参考https://blog.csdn.net/qq_46105170/article/details/113815655。对于一个正整数 x x x,若其质因子分解是 x = p 1 α 1 p 2 α 2 . . . p k α k x=p_1^{\alpha_1}p_2^{\alpha_2}...p_k^{\alpha_k} x=p1α1p2α2...pkαk,那么 x x x的约数个数是 ( 1 + p 1 + p 1 2 + . . . + p 1 α 1 ) ( 1 + p 2 + p 2 2 + . . . + p 2 α 2 ) . . . ( 1 + p k + p k 2 + . . . + p k α k ) (1+p_1+p_1^2+...+p_1^{\alpha_1})(1+p_2+p_2^2+...+p_2^{\alpha_2})...(1+p_k+p_k^2+...+p_k^{\alpha_k}) (1+p1+p12+...+p1α1)(1+p2+p22+...+p2α2)...(1+pk+pk2+...+pkαk)。那么若 a = p 1 α 1 . . . p k α k a=p_1^{\alpha_1}...p_k^{\alpha_k} a=p1α1...pkαk,那么 a b a^b ab的约数个数是 ( 1 + p 1 + . . . + p 1 b α 1 ) ( 1 + p 2 + . . . + p 2 b α 2 ) . . . ( 1 + p k + . . . + p k b α k ) (1+p_1+...+p_1^{b\alpha_1})(1+p_2+...+p_2^{b\alpha_2})...(1+p_k+...+p_k^{b\alpha_k}) (1+p1+...+p1bα1)(1+p2+...+p2bα2)...(1+pk+...+pkbαk)。所以可以先对 a a a进行质因子分解,然后问题变为怎么计算 1 + p + . . . + p k − 1 1+p+...+p^{k-1} 1+p+...+pk−1。设 f ( k ) = 1 + p + . . . + p k − 1 f(k)=1+p+...+p^{k-1} f(k)=1+p+...+pk−1,如果 k k k是偶数,则 f ( k ) = ( 1 + p + . . . + p k 2 − 1 ) + ( p k 2 + p k 2 + 1 + . . . + p k − 1 ) = ( 1 + p k 2 ) ( 1 + p + . . . + p k 2 − 1 ) = ( 1 + p k 2 ) f ( k 2 ) f(k)=(1+p+...+p^{\frac{k}{2}-1})+(p^{\frac{k}{2}}+p^{\frac{k}{2}+1}+...+p^{k-1})\\=(1+p^{\frac{k}{2}})(1+p+...+p^{\frac{k}{2}-1})=(1+p^{\frac{k}{2}})f(\frac{k}{2}) f(k)=(1+p+...+p2k−1)+(p2k+p2k+1+...+pk−1)=(1+p2k)(1+p+...+p2k−1)=(1+p2k)f(2k)又有 f ( 1 ) = 1 f(1)=1 f(1)=1,所以问题转化为怎么求 p k 2 m o d 9901 p^{\frac{k}{2}}\mod 9901 p2kmod9901( 9901 9901 9901是素数),这可以用快速幂来求,参考https://blog.csdn.net/qq_46105170/article/details/113823747。如果 k k k是奇数,那么 k − 1 k-1 k−1是偶数,有 f ( k ) = 1 + p ( 1 + p + . . . + p k − 2 ) = 1 + p f ( k − 1 ) f(k)=1+p(1+p+...+p^{k-2})=1+pf(k-1) f(k)=1+p(1+p+...+pk−2)=1+pf(k−1)就转化为已解决的问题了。代码如下:
#include <iostream>
#include <cstring>
using namespace std;const int MOD = 9901;// 快速幂
int qmi(int a, int k) {a %= MOD;int res = 1;while (k) {if (k & 1) res = res * a % MOD;a = a * a % MOD;k >>= 1;}return res;
}int sum(int p, int k) {if (k == 1) return 1;if (k % 2 == 0) return (1 + qmi(p, k >> 1)) * sum(p, k >> 1) % MOD;return (sum(p, k - 1) + qmi(p, k - 1)) % MOD;
}int main() {int a, b;scanf("%d%d", &a, &b);int res = 1;for (int i = 2; i <= a / i; i++)if (a % i == 0) {int cnt = 0;while (a % i == 0) {cnt++;a /= i;}res = res * sum(i, b * cnt + 1) % MOD;}if (a > 1) res = res * sum(a, b + 1) % MOD;if (a == 0) res = 0;printf("%d\n", res);return 0;
}
时间复杂度 O ( a + log 2 b ) O(\sqrt{a}+\log^2 b) O(a +log2b),空间 O ( log b ) O(\log b) O(logb)。
【ACWing】97. 约数之和相关推荐
- 《算法竞赛进阶指南》打卡-基本算法-AcWing 97. 约数之和:递归、快速幂
文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 快速幂参考笔者的这篇博文: 算法刷题-数论-组合数.快速幂.逆元.递推求组合数.逆元求组合数 约数之和参考笔者的这篇博文: 算法刷题 ...
- lightoj 1098 A New Function 约数之和(一道奇怪的数论) 整除分块优化
文章目录 题目如下: 思考人生: 题目如下: lightoj 1098 A New Function 求1-n所有数的所有约数之和(不包括1和它本身).n<=2e9. 思考人生: 首先考虑打表找 ...
- 数论 - 约数基础 【 试除法求所有约数 + 约数个数和约数之和 + 欧几里得算法-求解最大公约数 】
数论-约数基础 1.约数定义 约数,又称因数.整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a.a称为b的倍数,b称为a的约数.在大学之前,"约数 ...
- 算法刷题-数论-试除法求约数、约数个数、约数之和、最大公约数(辗转相除法)
文章目录 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. ...
- 约数之和(分治,公式变形)
题目链接 AcWing 97. 本题有两种方法,公式法与求逆元,这里使用逆元求等比数列的和 注意逆元不存在的情况(代码中有标注) /*1.分治法2.同余逆元对于(a/b)%MOD 逆元不存在:等价于b ...
- 约数之和 c语言,(c语法百题20)约数之和,约数之和
(c语法百题20)约数之和,约数之和 知识点: 求约数的算法 for语句,if语句灵活运用. 内容: 键入一个自然数 ,求这个自然数的所有约数之和 输入说明: 一个整数 输出说明: 一个整数 输入样例 ...
最新文章
- java 字符处理_Java字符串处理实用代码
- 利用bigpipe机制实现页面模块的异步渲染 chunked技术
- Java开发者必须知道的内存泄漏问题
- 计算机网络之数据链路层思维导图总结
- mysql重装_连我mysql读你文件
- SharpDevelop 如何切换设计视图和代码视图
- OpenCV-Python实战(番外篇)——OpenCV实现图像卡通化
- Windows Mobile Sensors API库的设计
- 背景减法——自组织算法
- python里countsget_Python Pandas Series.get_dtype_counts()用法及代码示例
- NAT篇 双剑合璧,无往不利——双向NAT
- 软考系统分析师备考详细介绍
- element-ui的分页,添加首页、尾页,跳转按钮
- jQuery常用API
- 基于 Django 的图书馆借阅系统
- 记一次逗逼的codecraft算法大赛的参赛经历
- 华为nova6开启开发者模式,连接USB
- 游戏服务器的那些事儿
- Linux 环境下iSCSI Target 与 Initiator 配置
- md5加密以及可逆的加密解密算法