当前位置: 首页 > news >正文

洛谷P1593 因子和 题解

看到 \(a,b \le 5 \times 10^7\),这显然是一道数学题。

每一个数都可以分解成若干个素数的乘积,\(a^b\) 的因子也是一样的。

很容易想到对 \(a\) 进行质因数分解,设 \(a = \prod_{i = 1}^k p_i^{e_i}\),显有 \(a^b = \prod_{i = 1}^k p_i^{e_i \times b}\),而 \(a^b\) 的因子和就是 \(\prod_{i = 1}^k \sum_{j = 0}^{e_i \times b} p_i^j\),直观一点就是 \((1+p_1+p_1^2+\dots+p_1^{e_1 \times b}) \times (1+p_2+p_2^2+\dots+p_2^{e_2 \times b}) \times \dots \times (1+p_k+p_k^2+\dots+p_k^{e_k \times b})\),此时如果直接求是可以被卡掉的。

如何优化?显然 \(1,p_i,p_i^2,\dots,p_i^{e_i \times b}\) 是一个等比数列,那么根据等比数列求和公式(对于该公式的推导请看这里),我们有 \(\sum_{j = 0}^{e_i \times b} p_i^j = \frac{p_i^{e_i \times b+1}-1}{p_i-1}\),所以原式变为 \(\prod_{i = 1}^k \frac{p_i^{e_i \times b+1}-1}{p_i-1}\),此时只需要维护 \(p_i-1\) 在模 \(9901\) 意义下的逆元就行了,因为 \(9901\) 是素数(可以写程序验证),所以可以用费马小定理求逆元。

如果写程序的时候为了加快效率而不开 long long 的话,那么一定要记得 \(9901\) 这个模数很小,求快速幂的时候对与初始的底数一定要记得取模。

\(p_i-1 \equiv 0 \pmod {9901}\),那么也就是说 \(p_i-1\) 在模 \(9901\) 的意义下不存在逆元,此时我们不能再用等比数列公式进行求和了,但是我们可以尝试直接求这个等比数列在模 \(9901\) 意义下的和。因为 \(p_i-1 \equiv 0 \pmod {9901}\) 等价于 \(p_i \equiv 1 \pmod {9901}\),也就是说存在 \(k \in \mathbb{N}^+\) 使得 \(p_i = k \times 9901+1\),也就是说此时 \(p_i^n\) 可以转化为 \((k \times 9901+1)^n\),用二项式定理进行展开:

\[(k \times 9901+1)^n = \sum_{i = 0}^n \binom{n}{i} (k \times 9901)^i 1^{n-i} \]

显然只有在 \(i = 0\)\(\binom{n}{i} (k \times 9901)^i 1^{n-i} \equiv 1 \pmod {9901}\),其它情况都是 \(\binom{n}{i} (k \times 9901)^i 1^{n-i} \equiv 0 \pmod {9901}\),也就是说 \((k \times 9901+1)^n \equiv 1 \pmod {9901}\),可得 \(\forall n \in \mathbb{N},\ p_i^n \equiv 1 \pmod {9901}\),即:

\[\sum_{j = 0}^{e_i \times b} p_i^j \equiv e_i \times b+1 \pmod {9901} \]

于是就知道了 \(p_i-1 \equiv 0 \pmod {9901}\) 时该等比数列在模 \(9901\) 意义下的和,是 \((e_i \times b+1) \bmod 9901\)

代码:

#include<bits/stdc++.h>
using namespace std;
const int mod = 9901;
const int N = 1e5+5;
struct node
{int p;int e;
}s[N];
int main()
{ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);int a,b,num = 0;cin >> a >> b;for(int i = 2;i*i<=a;++i){int cnt = 0;while(a%i == 0){++cnt;a/=i;}if(cnt){s[++num] = {i,cnt*b};}}if(a>1){s[++num] = {a,b};}int sum = 1;for(int i = 1;i<=num;++i){int ni = 1,x = (s[i].p-1)%mod,y = mod-2;if(!x){sum = sum*((s[i].e+1)%mod)%mod;continue;}while(y){if(y&1){ni = ni*x%mod;}x = x*x%mod;y>>=1;}int ans = 1;x = s[i].p%mod,y = s[i].e+1;while(y){if(y&1){ans = ans*x%mod;}x = x*x%mod;y>>=1;}sum = sum*(ans-1+mod)%mod*ni%mod;}cout << sum;return 0;
}
http://www.jsqmd.com/news/432598/

相关文章:

  • AI Agent 完全指南:2026 年核心概念、主流框架、开发实践与选型建议
  • 植物大战僵尸杂交版下载:全网最详细的安装教程,手机电脑都能玩(附下载地址) - xiema
  • 【每天学习一点算法 2026/03/03】递增的三元子序列
  • 谭蔚泓院士高分文章汇总(2025-2026)
  • (开源项目)当我用Codex修复本科做的双创项目...研梦:基于Django+Vue的考研信息化平台(论坛发帖、新闻资讯、爬虫趋势)
  • 今年准备看AI方向的机会?这份《大模型与Agent面试宝典》建议收藏
  • 选择WMS仓储管理系统供应商时,需要考察哪些关键因素?
  • vue3中台框架解析
  • 2026年度无管道单向流新风系统品牌TOP10榜单:技术创新与场景适配性双维度评选 - 野榜精选
  • 2026年河北滚齿机厂家实力榜:六轴数控滚齿机、四轴数控滚齿机、五轴数控滚齿机、大型数控滚齿机、卧式滚齿机、大模数滚齿机、五家企业凭技术与口碑出圈 - 海棠依旧大
  • 智能体技能构建手册:让AI真正“动手“的模块化艺术
  • 初创企业如何构思创意域名
  • 没有哲学社会科学预印本平台,也没关系
  • Lumina-mGPT多模态模型解析(持续更新)[特殊字符][特殊字符]
  • 创客匠人的用户旅程重构:AI智能体如何编织知识变现的隐形价值链
  • Mask2Former图像分割ADE20k训练 Swin-Tiny模型详解 [特殊字符]
  • 创客匠人的无界知识:AI智能体如何破译跨文化知识变现的密码
  • 建议收藏|大模型转行入门全攻略:后端/小白/转行者必看,少走90%弯路
  • MaskFormer 图像分割神器!!!!!!
  • 金三银四Java面试题(总结最全面的面试题)
  • 收藏 | 从个人助理到团队协作:小白/程序员必学大模型Multi-Agent实战(附LangGraph框架)
  • MiDaS深度估计算法与Unity Sentis实现 [特殊字符]
  • 大模型应用的未来:Langgraph智能体开发入门与收藏指南
  • 2026年河北数控滚齿机标杆厂家最新推荐:大模数滚齿机、螺旋内齿滚齿机、YK3180滚齿机、YK3180数控滚齿机、卓昊机械齿轮加工设备品质新标杆 - 海棠依旧大
  • 2026药学主任药师考试靠谱机构推荐,附备考干货 - 医考机构品牌测评专家
  • 5分钟Mac本地跑通32B Qwen!免费GPT-4o替代,还能5分钟造个会开浏览器+执行Shell的AI Agent
  • Oracle:无效的数据
  • 闲置的步步高超市卡怎么回收呢?速看攻略 - 京顺回收
  • MeloTTS-ONNX中英混合模型(支持CPU快速推理)
  • 2026药学主任药师考试机构推荐,上岸考生亲测靠谱分享 - 医考机构品牌测评专家