// Tester int main() { int n; while(1) { printf("Enter n: \n"); scanf("%d", &n); printf("Result: %d\n\n\n", trailing(n)); } }
long long binomial(long long n, long long k, long long p, long long q){ if (k > n || k < 0) return 0; if (n == k || k == 0) return 1; int i, j; for (i = 0, mod = 1; i < q; i++) mod *= p; long long t = trailing(n, p) - trailing(k, p) - trailing(n - k, p); if (t >= q) return 0; assert(mod < MAXP); for (dp[0] = 1, i = 1; i < mod; i++){ dp[i] = (long long)dp[i - 1] * ((i % p) ? i : 1) % mod; } long long res = factorial(n, p) * expo(factorial(k, p) * factorial(n - k, p) % mod, (mod / p) * (p - 1) - 1, mod) % mod; for (i = 0; i < t; i++) res = res * p % mod; return res; }
wchar_t *MrDecodeUtf8(wchar_t *out, uint8_t *utf, int len) { wchar_t *result = out; bool create_buffer = out == NULL; if (len < 0) len = strlen(utf); if (create_buffer) result = out = malloc((len + 1) * sizeof(wchar_t)); // Ignore mangled byte order mark (UTF-8 indicator) if (!strncmp(utf, "\xef\xbb\xbf", 3)) utf += 3; while (len--) if (*utf < 0x80) *out++ = *utf++; else if (~*utf & 0x20 && trailing(1)) { // two byte *out++ = (utf[0] & 0x1f) << 6 |(utf[1] & 0x3f); utf += 2; overlong(0x80); } else if (~*utf & 0x10 && trailing(1) && trailing(2)) { // three byte *out++ = (utf[0] & 0x0f) << 12 |(utf[1] & 0x3f) << 6 |(utf[2] & 0x3f); utf += 3; overlong(0x800); } else { // Discard malformed or non-BMP characters utf++; while ((*utf & 0xc0) == 0x80) utf++; *out++ = 0xfffd; /* replacement char */ } *out = 0; if (create_buffer) result = realloc(result, (out - result + 1) * sizeof(wchar_t)); return result; }