题目:lanqiaoOJ 1462
2021年蓝桥杯省赛,回路计数。
#include <iostream>//如果用int,结果是544071680
using namespace std;
#define int long long
int f[1 << 22][22];
int gcd[22][22];
void gys()
{
for(int i=1;i<=21;++i)
for (int j = 1; j <= 21; ++j)
{
int a = i, b = j;
while (!(a == b || a == 1 || b == 1))
{
int t = a;
a = b;
if (t > b)
b = t - b;
else
b = t % b;
}
if (a == 1 || b == 1)
gcd[i - 1][j - 1] = gcd[j - 1][i - 1] = 1;
}
}
signed main()
{
gys();
int n = 1 << 21;
f[1][0] = 1;
for(int i=1;i<n;++i)
for (int j = 0; j < 21; ++j)
{
if (i >> j & 1)
for (int k = 0; k < 21; ++k)
{
if(gcd[j][k]&&(i>>k&1)==0)
f[i + (1 << k)][k] += f[i][j];
}
}
int num = 0;
for (int i = 0; i < 21; ++i)
num += f[n - 1][i];
cout << num;
return 0;
}
这个看代码应该就能看懂了。
千里之行,始于足下。