约数之和
#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); }