zoukankan      html  css  js  c++  java
  • 数论

    约数之和

    #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
    ");
            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
    ",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);
    }

      

  • 相关阅读:
    20200816
    20200815
    20200813
    20200811
    20200810
    20200806
    20200804
    20200803
    20200802
    20200801
  • 原文地址:https://www.cnblogs.com/Accpted/p/11286798.html
Copyright © 2011-2022 走看看