熔池技术
两个nb式:
集合Ai表示含有Pi性质的集合
1.不含P的并 = S - 1个交 + 2 个交 - 3个交......
2.包含P的并 = 1个交 - 2 个交 + 3个交......
文氏图可以很好的理解。包含P的并是不含P的补集,两者相加就是全集。
1.Amusement Park
绝了。。。做了好几天,首先如果一个图翻成DAG用了p次,那么这个DAG的反图也是DAG,这个DAG翻了m - p次,也就是可以两两分组,一组内的次数平均m/2,我们只用求出DAG的方案数即可。
设dp[S]选的点为S,组成DAG的方案数,DAG---拓扑序,所以每次加入一个独立集,保证仍然是一个DAG
dp[S] += dp[S ^ sub];
但是问题在于对于一个独立集,它一次加入一个,一次加入两个,或者一次加入三个,的贡献都是cnt,但是我们只想要一个,所以熔池系数是\((- 1) ^ {|S| + 1}\),那么直接熔池技术。
$ dp[S] = \sum dp[S \space xor \space {sub}] * (-1) ^{builtinpopcount(sub) + 1 } $
2.串珠子
铭铭有n个十分漂亮的珠子和若干根颜色不同的绳子。现在铭铭想用绳子把所有的珠子连接成一个整体。
现在已知所有珠子互不相同,用整数1到n编号。对于第i个珠子和第j个珠子,可以选择不用绳子连接,或者在ci,j根不同颜色的绳子中选择一根将它们连接。如果把珠子看作点,把绳子看作边,将所有珠子连成一个整体即为所有点构成一个连通图。特别地,珠子不能和自己连接。
铭铭希望知道总共有多少种不同的方案将所有珠子连成一个整体。由于答案可能很大,因此只需输出答案对1000000007取模的结果。
g[S] 不保证联通图的个数
f[S]保证联通
g[S]直接所有A + 1乘起来就行。
f[S] 为总方案数-子集联通 * 补集 不保证联通;
套路,目前想不明白。
点击查看代码
f[S] = g[S];
for(int sub = S ^ (S & (-S));sub;sub = (sub - 1) & (S ^ (S & (-S))))f[S] = (f[S] - f[S ^ sub] * g[sub] % Mod) % Mod;
3.朴素计数:
F序列,使得gcd(F) = x,lcm(F) = y,求F序列的种类数。
考虑gcd,lcm,就是质因子的幂次最小值和x的相同,最大值和y的相同,但是质因子独立(这个东西没想到),然后就是至少一个x,至少一个y,直接容斥就行,总共是$(y - x + 1)^n $,不含x或者y的是 $ (y - x)^n $ ,两者都不含的是 \((y - x - 1) ^ n\),
也可以推式子,就是枚举有多少x,y,疯狂用二项式定理就行