约数之和

题意:假设现在有两个自然数 ABSAB 的所有约数之和。求S mod 9901的值。
 

前置知识

 

唯一分解定理可得:一个数可以表达成A=p1k1×p2k2×p3k3×...×pnkn的形式。pi为不同的质数。
 
A的每个约数都可以看作从上式的每一项中抽取了特定个数(0~ki个)的pi,最后乘在一起得到的。
 
设某约数是从第一项中选了cnt1个,第二项中选了cnt2个,... ,第n项中选了cntn个得到的,那么该约数可以表达为:p1cnt1p2cnt2...pncntn
 
特别的cnt1 = cnt2 = ... = cntn = 0时,约数表示为1。
  
 

两个重要的公式

 
  • 约数个数

(k1+1)×(k2+1)×(k3+1)×...×(kn+1)

  对每一项pi而言,可以的选择的个数为 0 ~ ki个,一共ki + 1种,所以总共有(k1 + 1) * (k2 + 1) * ... * (kn + 1)种选择,即约数的个数。

  只要选择稍有不同,得到的约数就不一样,不会重复,也不会遗漏。
 
 
  • 约数之和

(p10+p11+p12+...+p1k1+p1k)×(p20+p21+p22+...+p2k1+p2k)×...×(pn0+pn1+pn2+...+pnk1+pnk)
 
  为什么上面这个式子可以表示约数的和呢,因为将这个式子每一项展开之后可以得到每一项因子,加起来便为约数和。所以求解约数和就变成了求解括号内的每一个通项
 
   定义一个函数sum(p,k),用来求解每一项(pi0+pi1+pi2+...+pik1+pik)
 
  这个式子的求解可以使用递归,在时间复杂度O(logn)的情况下求出每一项和,下面是推导过程
 
  • 如果k是奇数,即该式子有偶数项,那么如下:
p0+p1+p2+...+pk1+pk=(p0+p1+...+pk2)+(pk2+1+pk2+2+...+pk)=(p0+p1+...+pk2)+(pk2+1×(p0+p1+...+pk2))=(p0+p1+...+pk2)×(1+pk2+1)
  问题的规模就从sum(p,k)转换成了sum(p,k2),递归即可求得;
  同时,观察推导式,我们还需要用快速幂求出p(k2+1)
 
  • 如果k是偶数,有奇数项,那么先套用公式计算出p0+p1+p2+...+p(k1),即sum(p,k1),然后将算出的数乘p,即是p1+p2+...+pk的值,然后加上p0 ,即1,得解。
 
复制代码
#include<bits/stdc++.h>
using namespace std;
#define ll long
const int mod = 9901;
//对于有取模操作的数,x = x * x % mod;
ll getmi(int x, int k) {
    x %= mod;
    ll res = 1;
    while (k) {
        if (k & 1) res = (res * x) % mod;
        x = (x * x) % mod;
        k >>= 1;
    }
    return res;
}

ll sum(int p, int k) {
    if (k == 0) return 1;
    if (k & 1) {
        return (1 + getmi(p, k / 2 + 1)) * sum(p, k / 2) % mod;
    } else {
        return (1 + p % mod * sum(p, k - 1)) % mod;
    }
}

int main() {
    int a, b;
    cin >> a >> b;
    ll ans = 1;
    for (int i = 2; i <= a; i ++) {
        int k = 0;
        while (a % i == 0) {
            k ++;
            a /= i;
        }
        ans = ans * sum(i, k * b) % mod;
    }
    if (!a) ans = 0;
    cout << ans << "\n";
    return 0;
}
复制代码

 

posted @   Y2ZH  阅读(141)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示