代码如下(对点做了处理,从1到21,处理为0到20,便于位运算,答案为:881012367360):
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int M=22;const int N=1<<M;
ll dp[N][M];int p[M][M];
int gcd(int a,int b)
{
if(a%b==0) return b;
return gcd(b,a%b);
}
void getpath()
{
for(int i=1;i<=21;i++)
{
for(int j=1;j<=21;j++)
if(i==j) p[i-1][j-1]=0;
else if(gcd(i,j)==1) p[i-1][j-1]=1;
}
return ;
}
int main()
{
getpath();
dp[1][0]=1;
for(int i=0;i<1<<21;i++)
{
for(int j=0;j<21;j++)
{
if(i>>j&1)
{
for(int k=0;k<21;k++)
{
if(i>>k&1&&p[k][j])
{
dp[i][j]+=dp[i-(1<<j)][k];
}
}
}
}
}
ll ans=0;
for(int i=0;i<21;i++)
{
ans+=dp[(1<<21)-1][i];
}
printf("%lld\n",ans);
}