Exemplo n.º 1
0
// 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;
    }
Exemplo n.º 3
0
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;
}