组合数模板
#include <iostream> #include <cstdio> using namespace std; const int MOD = 3761599; const int MAXN = 1100010; int e[MAXN], f[MAXN], temp[MAXN]; void init() { long long t = 1; for (int i = 1; i < MAXN; i++) { t *= i; t = t % MOD; temp[i] = t; } temp[0] = 1; } int gcd(int a, int b) { if (b == 0) return a; return gcd(b, a % b); } void e_gcd(int a, int b, int &x, int &y) { if (!b) { x = 1, y = 0; } else { e_gcd(b, a % b, x, y); int l = x; x = y; y = l - a / b * y; } } int choose(int n, int m) { if (m > n) return 0; else if(n == m) return 1; long long nn = temp[n], mm = (temp[m] *temp[n - m]) % MOD; int d = gcd(nn, mm); nn /= d; mm /= d; int x, y; e_gcd(mm, MOD, x, y); x = (x + MOD) % MOD; return (x * nn) % MOD; } int cal(int n, int m) { int i = 0; while (n > 0) { e[i++] = n % MOD; n = n / MOD; } int len = i; i = 0; while (m > 0) { f[i++] = m % MOD; m = m / MOD; } long long re = 1; for (int i = 0; i < len; i++) re = (re * choose(e[i], f[i])) % MOD; return (int) re; } int main() { int n,m; init(); while (cin>>n>>m) cout<<cal(n,m)<<endl; return 0; }