数论

约数之和

#include <bits/stdc++.h>
using namespace std;
const int mod=9901;
int ans=1;
int quick(int a,int b) {
    int res = 1;
    a=a%mod;
    while (b) {
        if (b & 1) {
            res = res * a % mod;
        }
        a = a * a % mod;
        b >>= 1;
    }
    return res;
}

int calc(int p,int k) {
    if (k == 0) {
        return 1;
    }
    if (k % 2 == 0) {
        return (p % mod * calc(p, k - 1) + 1) % mod;
    }
    return (1 + quick(p, k / 2 + 1)) * calc(p, k / 2) % mod;
}
int main() {
    int A, B;
    scanf("%d%d", &A, &B);
    if (!A) {
        printf("0\n");
        return 0;
    }
    for (int i = 2; i <= A; i++) {
        int k = 0;
        while (A % i == 0) {
            A = A / i;
            k++;
        }
        if (k) {
            ans = ans * calc(i, k * B)%mod;
        }
    }
    printf("%d\n",ans);
}

处理阶乘和阶乘的逆元

void init(int n)
{
    f[0]=1;
    for (int i=1; i<=n; i++)
    {
        f[i]=f[i-1]*i%mod;
    }
    inv[n]=quick(f[n],mod-2);
    for(int i=n-1; i>=0; i--)
    {
        inv[i]=inv[i+1]*(i+1)%mod;
    }
}

线性求逆元

void get_inv(int n){
    inv[1]=1;
    for (int i=2;i<=n;i++){
        inv[i]=(mod-mod/i)*inv[mod%i]%mod;
    }
}  

Lucas

int Lucas(int n,int m){
    if (!m){
        return 1;
    }
    return (C(n%p,m%p)*Lucas(n/p.m/p)%p);
}

中国剩余定理

模p余a,p两两互质
void exgcd(ll a,ll b,ll &d,ll &x.ll &y){
    if (!b){
        d=a;
        x=1;
        y=0;
    }
    exgcd(b,a%b,d,y,x);
    y-=a/b*x;
}
ll inv(ll a,ll p){
    ll d,x,y;
    exgcd(a,b,d,x,y);
    return d==1?(x%p+p)%p:-1;
}
ll CRT(){
    ll ret=0,lcm=1;
    for (int i=1;i<=n;i++){
        lcm=lcm*p[i];
    }
    for (int i=1;i<=n;i++){
        ll x=lcm/p[i];
        ll k=inv(x,p[i]);
        ret=(ret+a[i]*x*k)%lcm;
    }
    return ret;
}

模p余a,p两两不互质
void exgcd(ll a,ll b,ll &d,ll &x.ll &y){
    if (!b){
        d=a;
        x=1;
        y=0;
    }
    exgcd(b,a%b,d,y,x);
    y-=a/b*x;
}
ll CRT(){
    ll P=p[1],A=a[1],t;
    for (int i=2;i<=n;i++){
        ll d,x,y;
        exgcd(P,p[i],d,x,y);
        if ((a[i]-A)%d) return -1;
        x*=(a[i]-A)/d;
        t=p[i]/d;
        x=(x%t+t)%t;
        A=P*x+A;
        P=P/d*p[i];
        A%=P;
    }
    A=(A%P+P)%P;
    return A;
}

  

 

上一篇:乘法逆元


下一篇:CF1043F Make It One 容斥原理+dp