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,1)\)
- \((2,1)\)
- \((3,1)\)
- \((1,1)(2,1)\)
- \((1,1)(3,1)\)
- \((2,1)(3,1)\)
所以喝酒方案就是:
这里用 \((x,y)\) 表示第 \(x\) 天喝第 \(y\) 桶酒
- \((1,2)(1,5)(1,6)\)
- \((1,3)(1,5)(1,7)\)
- \((1,4)(1,6)(1,7)\)