intqpow(int a, int b) { int ans = 1; while (b) { if (b & 1) { ans = ans * a % p; } a = a * a % p; b >>= 1; } return ans; } voidinit(int n) { f[0] = g[0] = 1; for (int i = 1; i <= n; i++) { f[i] = f[i - 1] * i % p; g[i] = g[i - 1] * qpow(i, p - 2) % p; } } intgetC(int n, int m) { return f[n] * g[m] % p * g[n - m] % p; }
intqpow(int a, int b, int p) { int ans = 1; while (b) { if (b & 1) { ans = ans * a % p; } a = a * a % p; b >>= 1; } return ans; } voidinit(int p) { f[0] = g[0] = 1; for (int i = 1; i <= p; i++) { f[i] = f[i - 1] * i % p; g[i] = g[i - 1] * qpow(i, p - 2, p) % p; } } intgetC(int n, int m, int p) { return f[n] * g[m] * g[n - m] % p; } intLucas(int n, int m, int p) { if (m == 0) { return1; } returnLucas(n / p, m / p, p) * getC(n % p, m % p, p) % p; }
#include<bits/stdc++.h> usingnamespace std; constint N = 5e3 + 10; int primes[N], vis[N], cnt; int C[N]; voidget_primes(int n) { // 筛素数 for (int i = 2; i <= n; i++) { if (!vis[i]) { primes[cnt++] = i; } for (int j = 0; i * primes[j] <= n; j++) { vis[i * primes[j]] = 1; if (i % primes[j] == 0) { break; } } } } intget(int n, int p) { // n!中p的个数 int s = 0; while (n) { s += n / p, n /= p; } return s; } intgetps(int n, int m, int p) { // C中p的个数 returnget(n, p) - get(m, p) - get(n - m, p); } voidmul(int C[], int p, int &len) { // 高精度 int t = 0; for (int i = 0; i < len; i++) { t += C[i] * p; C[i] = t % 10; t /= 10; } while (t) { C[len++] = t % 10; t /= 10; } } intmain() { int n, m; cin >> n >> m; get_primes(n); int len = 1; C[0] = 1; for (int i = 0; i < cnt; i++) { int p = primes[i]; int s = getps(n, m, p); while (s--) { mul(C, p, len); } } for (int i = len - 1; i >= 0; i--) { cout << C[i]; } cout << '\n'; return0; }
#include<bits/stdc++.h> usingnamespace std; constint N = 5010; int primes[N], cnt; int sum[N]; bool st[N]; voidget_primes(int n) { for (int i = 2; i <= n; i++) { if (!st[i]) { primes[cnt++] = i; } for (int j = 0; primes[j] <= n / i; j++) { st[primes[j] * i] = true; if (i % primes[j] == 0) { break; } } } } intget(int n, int p) { int res = 0; while (n) { res += n / p; n /= p; } return res; } vector<int> mul(vector<int> a, int b) { vector<int> c; int t = 0; for (int i = 0; i < a.size(); i++) { t += a[i] * b; c.push_back(t % 10); t /= 10; } while (t) { c.push_back(t % 10); t /= 10; } return c; } intmain() { int n, m; cin >> n >> m; get_primes(n); for (int i = 0; i < cnt; i++) { int p = primes[i]; sum[i] = get(n, p) - get(n - m, p) - get(m, p); } vector<int> res; res.push_back(1); for (int i = 0; i < cnt; i++) { for (int j = 0; j < sum[i]; j++) { res = mul(res, primes[i]); } } for (int i = res.size() - 1; i >= 0; i--) { cout << res[i]; } cout << '\n'; return0; }