运行时间:1分半左右出结果
#include<iostream>
#include<unordered_map>
#include<vector>
int total = 21;
std::vector<int>a[22];
std::unordered_map<std::string,long long>Map;
std::string add_index(std::string status,int index)
{
int i = status.size() - 1;
status[i--] = '0' + (index % 10);
status[i] = '0' + (index / 10);
return status;
}
long long DFS(std::string status,int num,int count)
{
if(count == total)
{
return 1;
}
std::string str;
long long s = 0;
for(int i = 0;i < a[num].size();i++)
{
if(num == 1)
{
std::cout<<i<<std::endl;
}
if(status[a[num][i]] == '0')
{
str = add_index(status,a[num][i]);
if(Map.find(str) != Map.end())
{
s += Map[str];
}
else
{
std::string str1 = str;
str1[a[num][i]] = '1';
long long sum = DFS(str1,a[num][i],count + 1);
Map[str] = sum;
s += sum;
}
}
}
return s;
}
int gcd(int a,int b)
{
return b == 0 ? a : gcd(b,a % b);
}
int main()
{
for(int i = 1;i < total;i++)
{
for(int j = i + 1;j <= total;j++)
{
if(gcd(i,j) == 1)
{
a[i].push_back(j);
a[j].push_back(i);
}
}
}
std::string str;
for(int i = 0;i <= 23;i++)
{
str += '0';
}
str[1] = '1';
std::cout<<DFS(str,1,1);
return 0;
}
//答案:881012367360