20150311总结

来源:互联网 发布:少女前线9a91白板数据 编辑:程序博客网 时间:2024/06/12 22:57

biga:

题目大意:一个有N个元素的集合有2^N个不同子集,现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为k,求取法的方案数,答案模1000000007。

解法:先计算交集大小至少为i的集合有C(n, m)种,其它2^(n - m)个集合 一共2 ^ (2 ^ (n - m))种,反复容斥,若i为偶数,答案增加 C(n, i) * C(i, k) * 2 ^ (2 ^ (n - i)),否则减小 C(n, i) * C(i, k) * 2 ^ (2 ^ (n - i));

最后公式为:

fac[0] = 1;    for (int i = 1; i <= n; i++) fac[i] = fac[i - 1] * i % mod;    inv[1] = 1;    for (int i = 2; i <= n; i++) inv[i] = (mod - mod / i) * inv[mod % i] % mod;    inv[0] = 1;    for (int i = 1; i <= n; i++) inv[i] = (inv[i] % mod) * (inv[i - 1] % mod) % mod;    long long tmp = 2;    for (int i = n; i >= k; --i)    {        if (i != n) tmp = (tmp % mod) * (tmp % mod) % mod;        long long cni = fac[n] * inv[i] % mod * inv[n - i] % mod;        long long cik = fac[i] * inv[k] % mod * inv[i - k] % mod;        ans += (i - k & 1 ? mod - 1 : 1) * cni % mod * cik % mod * tmp % mod;        ans %= mod;    }

bigj:

题目:

高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友。这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科或者理科,那么他们又将收获一些喜悦值。作为计算机竞赛教练的scp大老板,想知道如何分配可以使得全班的喜悦值总和最大。

输入:

第一行两个正整数n,m。

接下来是六个矩阵。

第一个矩阵为n行m列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学选择文科获得的喜悦值。

第二个矩阵为n行m列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学选择理科获得的喜悦值。

第三个矩阵为n-1行m列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学与第i+1行第j列的同学同时选择文科获得的额外喜悦值。

第四个矩阵为n-1行m列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学与第i+1行第j列的同学同时选择理科获得的额外喜悦值。

第五个矩阵为n行m-1列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学与第i行第j+1列的同学同时选择文科获得的额外喜悦值。

第六个矩阵为n行m-1列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学与第i行第j+1列的同学同时选择理科获得的额外喜悦值。

解法:

参考bzoj3894所使用的思路,每个人抽象成一个点p,S向p连边,流量为选文科的高兴值,p向T连边,流量为选理科的高兴值。

然后加点:

S向p1连边,流量为与第i+1行第j列的同学同时选择文科的高兴值,p1向相邻点和自己的p连边,流量为inf

p2相T连边,流量为与第i+1行第j列的同学同时选择理科的高兴值,相邻点和自己的p向p2连边,流量为inf

S向p3连边,流量为与第i行第j+1列的同学同时选择文科的高兴值,p3向相邻点和自己的p连边,流量为inf

p4相T连边,流量为与第i行第j+1列的同学同时选择理科的高兴值,相邻点和自己的p向p4连边,流量为inf

然后就是裸的最大流了



0 0
原创粉丝点击