app软件程序开发,搜索引擎优化技术有哪些,学新媒体运营要多少钱,wordpress后台ftp正题
luogu AT3634 题目大意
给你一个图#xff0c;让你给图上的边定方向#xff0c;问1,2两个点可以到同一个点的方案数 解题思路
直接求可以到同一个点不好求#xff0c;可以用总方案数减去不合法方案数#xff0c;即到不了同一个点的方案数
那么就是有若干点把1,2分…正题
luogu AT3634 题目大意
给你一个图让你给图上的边定方向问1,2两个点可以到同一个点的方案数 解题思路
直接求可以到同一个点不好求可以用总方案数减去不合法方案数即到不了同一个点的方案数
那么就是有若干点把1,2分开设 f1/2,if_{1/2,i}f1/2,i 表示从 1/2 开始走可以走到状态 i 中的点这一部分直接求也不好求考虑容斥
先计算出 i 中的边随意定向的方案数记为s然后枚举一个状态 j表示只能到 j 的方案数对于补集中的边随便选因为无法到补集中的任何一个点所以里面的边的方向不影响那么有
f1/2,i2si−∑f1/2,j×2si⊕jf_{1/2,i}2^{s_i}-\sum f_{1/2,j}\times 2^{s_{i\oplus j}}f1/2,i2si−∑f1/2,j×2si⊕j
得到 f 后枚举1,2个点能到的点即可 code
#includecstdio
#includecstring
#includeiostream
#includealgorithm
#define ll long long
#define N 400
#define M 100000
#define mod 1000000007
using namespace std;
ll n,m,k,ans,X[N],Y[N],pw[N],s[M],f[3][M];
int main()
{scanf(%lld%lld,n,m);k(1n)-1;for(int i1;im;i)scanf(%lld%lld,X[i],Y[i]);pw[0]1;for(int i1;im;i)pw[i]pw[i-1]*2%mod;for(int i0;ik;i)for(int j1;jm;j)if((i(1X[j]-1))(i(1Y[j]-1)))s[i];for(int g1;g2;g)for(int i0;ik;i){if(!(i(1g-1)))continue;f[g][i]pw[s[i]];for(int ji;j;j(j-1)i)f[g][i](f[g][i]-f[g][i^j]*pw[s[j]]%modmod)%mod;}anspw[m];for(int i0;ik;i)for(int jk^i;j;j(j-1)(k^i))//点不能有交集if(s[i]s[j]s[i|j])//不存在边直接相连ans(ans-f[1][i]*f[2][j]%mod*pw[s[k^(i|j)]]%modmod)%mod;printf(%lld,ans);return 0;
}