博客
关于我
等比数列求和 (快速幂 + 逆元)
阅读量:394 次
发布时间:2019-03-05

本文共 1930 字,大约阅读时间需要 6 分钟。

要解决这个问题,我们需要计算两个自然数A和B的幂的所有自然数因子的和S,并对S取模9901。由于直接计算A^B可能会非常大,我们需要使用数学公式来高效计算。

方法思路

  • 质因数分解:首先对A进行质因数分解。例如,36的质因数分解是2^2 * 3^2。
  • 指数计算:将每个质因数的指数乘以B,得到A^B的质因数分解。例如,36^1的质因数分解是2^2 * 3^2。
  • 等比数列求和:对于每个质因数p,计算其在A^B中的指数e,然后使用等比数列求和公式计算其对应的和:(p^{e+1} - 1) / (p - 1)。
  • 快速幂和模运算:使用快速幂算法来计算大数的幂,并在每一步进行模运算,避免数值溢出。
  • 结果相乘:将所有质因数对应的等比数列和相乘,并对结果取模9901。
  • 解决代码

    #include 
    #include
    #include
    typedef long long ll;ll multi(ll a, ll b, ll m) { ll ans = 0; a %= m; while (b) { if (b & 1) { ans = (ans + a) % m; b--; } b >>= 1; a = (a + a) % m; } return ans;}ll quick_mod(ll a, ll b, ll mod) { ll res = 1; while (b) { if (b % 2 == 1) { res = multi(res, a, mod); } b >>= 1; a = multi(a, a, mod); } return res;}int main() { ll a, b; scanf("%I64d %I64d", &a, &b); if (a == 1) { printf("1\n"); return 0; } ll mod = 9901; ll result = 1; // 质因数分解函数 for (ll p = 2; p * p <= a; p += 2) { if (a % p == 0) { ll exponent = 0; while (a % p == 0) { exponent++; a /= p; } ll m = mod * (p - 1); ll numerator = quick_mod(p, exponent * b + 1, m); ll sum_p = (numerator + m - 1) / (p - 1) % mod; result = (result * sum_p) % mod; } } if (a > 1) { ll m = mod * (a - 1); ll exponent_plus_1 = b + 1; ll numerator = quick_mod(a, exponent_plus_1, m); ll sum_a = (numerator + m - 1) / (a - 1) % mod; result = (result * sum_a) % mod; } printf("%I64d\n", result); return 0;}

    代码解释

  • 质因数分解:使用试除法从小到大测试每个可能的质因数,直到分解完所有质因数。
  • 快速幂和模运算quick_mod函数使用二分法计算大数的幂,并在每一步进行模运算,避免数值溢出。
  • 等比数列求和:对于每个质因数p,计算其在A^B中的指数e,然后使用快速幂算法计算p的(e+1)次幂,使用等比数列求和公式计算和。
  • 结果相乘:将所有质因数对应的等比数列和相乘,并对结果取模9901,得到最终结果。
  • 通过这种方法,我们能够高效地计算大数的因数和,并对其取模,解决了问题中的计算难题。

    转载地址:http://edkzz.baihongyu.com/

    你可能感兴趣的文章
    opencv图像特征融合-seamlessClone
    查看>>
    OpenCV图像的深浅拷贝
    查看>>
    OpenCV在Google Colboratory中不起作用
    查看>>
    OpenCV学习(13) 细化算法(1)(转)
    查看>>
    OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
    查看>>
    OpenCV学堂 | CV开发者必须懂的9种距离度量方法,内含欧氏距离、切比雪夫距离等(建议收藏)
    查看>>
    OpenCV学堂 | OpenCV中支持的人脸检测方法整理与汇总
    查看>>
    OpenCV学堂 | OpenCV案例 | 基于轮廓分析对象提取
    查看>>
    OpenCV学堂 | YOLOv8与YOLO11自定义数据集迁移学习效果对比
    查看>>
    OpenCV学堂 | YOLOv8官方团队宣布YOLOv11 发布了
    查看>>
    OpenCV学堂 | YOLOv8实战 | 荧光显微镜细胞图像检测
    查看>>
    OpenCV学堂 | 汇总 | 深度学习图像去模糊技术与模型
    查看>>
    OpenCV安装
    查看>>
    OpenCV官方文档 理解k - means聚类
    查看>>
    opencv实现多路播放
    查看>>
    opencv常用函数
    查看>>
    OpenCV探索
    查看>>
    OpenCV添加中文(五)
    查看>>
    opencv源码查看
    查看>>
    OpenCV点目标检测未找到所有目标,并且找到的圆圈偏移
    查看>>