[lnsyoj509/AcWing99]约数之和

题意

原题链接
AB的约数之和mod9901

sol

x的约数之和f(x)可以通过以下公式计算
根据算数基本定理,将x分解为i=1kaipi
f(x)=i=1kj=0piaij=i=1kaipi+11ai1

证明

根据算数基本定理,将x分解为i=1kaipi
易知aipi的所有约数为ai0,ai1,ai2,...,aipi,共pi+1个,每一个aipi的约数中选择一项并相乘,可以构成x的所有约数,因此,x的约数之和即为每一个aipi的所有约数之和的积。显然,aipi的值为等比数列,它们的和为aipi+11ai1,所以x的约数之和为i=1kaipi+11ai1,即得证

至于分解AB,可以先对A进行质因数分解,则

AB=(i=1kaipi)B=i=1kaipiB

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#define x first
#define y second

using namespace std;
typedef pair<int, int> PII;

const int mod = 9901;

vector<PII> primes;
int a, b;

void div(int x){
    for (int i = 2; i <= x / i; i ++ ){
        if (x % i == 0){
            int cnt = 0;
            while (x % i == 0){
                x /= i;
                cnt ++ ;
            }
            primes.push_back({i, cnt});
        }
    }
    if (x != 1) primes.push_back({x, 1});
}

int qpow(int a, int k){
    int ans = 1;
    while (k){
        if (k & 1) ans = (long long) ans * a % mod;
        a = (long long) a * a % mod;
        k >>= 1;
    }
    return ans;
}

int main(){
    scanf("%d%d", &a, &b);
    div(a);
    long long ans = 1;
    for (auto p : primes){
        int m = qpow(p.x - 1, mod - 2); //计算逆元
        ans = ans * (qpow(p.x, p.y * b + 1) - 1) % mod * m % mod;
    }

    printf("%lld\n", ans);

    return 0;
}
posted @   是一只小蒟蒻呀  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示