回路计数
题目描述
蓝桥学院由 2121 栋教学楼组成,教学楼编号 11 到 2121。对于两栋教学楼 �a 和 �b,当 �a 和 �b 互质时,�a 和 �b 之间有一条走廊直接相连,两个方向皆可通行,否则没有直接连接的走廊。
小蓝现在在第一栋教学楼,他想要访问每栋教学楼正好一次,最终回到第一栋教学楼(即走一条哈密尔顿回路),请问他有多少种不同的访问方案?
两个访问方案不同是指存在某个 �i,小蓝在两个访问方法中访问完教学楼 �i 后访问了不同的教学楼。
//881012367360 #include <bits/stdc++.h> #define int long long using namespace std; int dp[1 << 22][22] , g[22][22]; signed main() { int n = 1 << 21; for(int i = 1 ; i <= 21 ; i ++) for(int j = 1 ; j <= 21 ; j ++){ if(__gcd(i , j) == 1) g[i - 1][j - 1] = g[j - 1][i - 1] = 1; } dp[1][0] = 1; for(int i = 1 ; i < n ; i ++){ for(int j = 0 ; j < 21 ; j ++){ if(!(i >> j & 1)) continue ; for(int k = 0 ; k < 21 ; k ++) { if(!g[j][k] || (i >> k & 1)) continue ; dp[i + (1 << k)][k] += dp[i][j]; } } } int res = 0; for(int i = 0 ; i < 21 ; i ++) { res += dp[n - 1][i]; } cout << res << '\n'; return 0; }