SSL 1473奶牛编号

Posted gjy-juruo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSL 1473奶牛编号相关的知识,希望对你有一定的参考价值。

题目大意:

求字典序第 (N) 大的只含 (k) 个 1 的 01 串。

正文:

考虑到用组合数,由于首位一定是 1,那么我们需要选择位置的 1 就只有 (k-1) 个,枚举 01 串长度 (len),长度为 (len) 的 01 串个数是 (C_{len}^{k-1}),每次枚举的时候用 (N) 减去。最后得到终点长度 (len),只需要求第 (N) 大了,暴力求即可。

代码:


void work(int len, int n)
{
	for (int i = len - k + 1; i <= len; i++) a[i] = 1;
	n--;
	while (n--)
	{
		int tot = 0, i;
		for (i = len; i >= 1; i--)
			if (a[i])
				break;
		for (; i >= 1; i--)
		{
			if (!a[i])
				break;
			tot++;
		}
		for (int j = len; j >= i; j--) a[j]=0;
		for (int j = len; j >= len - tot + 2; j--)
			a[j] = 1;
		a[i] = 1;
	}
	for (int i = 1; i <= len; i++) printf("%d", a[i]);
}

int main()
{
	scanf ("%d%d", &n, &k);
	C[0][0] = 1ll;
	for (int i = 1; i <= N - 10; i++)
	{
		C[i][0] = 1ll;
		for (int j = 1; j <= N - 10; j++)
			C[i][j] = C[i - 1][j] + C[i - 1][j - 1];
	}
	printf("1");
	if(k == 1)
	{
		for (int i = 1; i < n; i++)
			printf("0");
		puts("");
		return 0;
	}
	int len;
	for (len = k - 1; C[len][k - 1] < n; n -= C[len][k - 1], len++)
	{
		if(len == 2333){
			len = 2000;
		}
	}
	k--;
	work(len, n);
	return 0;
}

以上是关于SSL 1473奶牛编号的主要内容,如果未能解决你的问题,请参考以下文章

解决办法服务器支持 TLS Client-initiated 重协商攻击(CVE-2011-1473)

排序奶牛的编号

【SSL】关于SSL的重协商,解决SSL 重协商拒绝服务安全漏洞

leetcode1473. 粉刷房子 III(超难的三维dp问题)

笔试算法题目,奶牛排队喝水

SSL 2061_牛棚安排_匹配