CF643F Bears and Juice

tag:组合计数,构造(虽然题目不要求输出方案)


首先,定义『信息』,指『哪一熊在哪一天睡觉』,那么我们 \(k\) 天能够得到的不同信息总数为:

\[\sum_{i=0}^{\min\{p,n-1\}}\binom nik^i \]

意思是枚举有 \(i\) 头熊睡觉,然后从 \(n\) 头熊中选 \(i\) 头,每头熊从 \(k\) 天中选一天睡觉。

那么最优的情况显然就是一条『信息』确定一桶酒,而两条『信息』不会确定出同一桶酒。

然后根据经典套路,答案=上界瞎猜一下『一条信息和一桶酒一一对应』(后面有证明),也就是桶的最多数量就等于能获得的信息数,即:

\[R_i=\sum_{j=0}^{\min\{p,n-1\}}\binom nji^j \]

\[ans=XOR_{i=1}^q(i\cdot\sum_{j=0}^{\min\{p,n-1\}}\binom nji^j) \]

这里由于 \(\binom nj\)\(j\) 只有 \(130\),考虑把 \(n\to n-i+1\)\(1\to i\) 写成两行,然后枚举任意两个元素,消去它们的最大公因数。

for(register int i=1; i<=x; i++) a[i] = n-i+1, b[i] = i;
for(register int i=1; i<=x; i++) 
	for(register int j=1; b[i]!=1 and j<=x; j++){
		uint g = gcd(b[i],a[j]);
		a[j] /= g; b[i] /= g;
}
C[x] = 1; for(register int i=1; i<=x; i++) C[x] = C[x]*a[i];

复杂度 \(O(p^3logn+qp)\)

然后发现过了。


那么如何构造具体的喝酒方案,使得答案能够达到上界呢?

显然两条『信息』不能对应同一桶酒,否则就浪费了。

我们就把第 \(i\) 个『信息』确定出来的酒叫做『第 \(i\) 桶酒』。

那么如果一头熊在第 \(i\) 个『信息』中没有睡觉,那这头熊就不喝第 \(i\) 桶酒;否则在它睡觉的那天喝这桶酒。


举个例子,\(n=3,\ p=2,\ k=1\),所有可能的『信息』有:

这里用 \((x,y)\) 表示第 \(x\) 头熊在第 \(y\) 天睡觉

  1. 没有熊睡觉
  2. \((1,1)\)
  3. \((2,1)\)
  4. \((3,1)\)
  5. \((1,1)(2,1)\)
  6. \((1,1)(3,1)\)
  7. \((2,1)(3,1)\)

所以喝酒方案就是:

这里用 \((x,y)\) 表示第 \(x\) 天喝第 \(y\) 桶酒

  1. \((1,2)(1,5)(1,6)\)
  2. \((1,3)(1,5)(1,7)\)
  3. \((1,4)(1,6)(1,7)\)
posted @ 2021-06-26 14:07  oisdoaiu  阅读(28)  评论(0编辑  收藏  举报