抄一下 https://www.luogu.com.cn/article/n32presk,写的非常好。

下面是要把问题转化为一个群论问题。

定义拓扑空间:全集 \(X\) 和它的一个子集族 \(T\),使得 \(\varnothing,X\in T\),且任意有限个元素的交在 \(T\) 中,任意元素(不要求有限或可数)的并在 \(T\) 中。

则称 \((X,T)\) 是拓扑空间,\(T\) 内元素叫开集,不在的是闭集。

拓扑空间之间的函数 \(f:X\to Y\) 是连续的,当且仅当 \(\forall t\in T_Y\),\(f^{-1}(t)\in T_X\)(数学分析中有形式一样的度量空间上的结论)

对于这道题,不用太在意这个定义,因为 \(\R,\R^2\) 及其子空间的开集概念是熟知的。

下记 \(S^1\) 为单位圆(就是首尾相接的 \([0,1]\))。

对于拓扑空间 \(X\),一条道路是 \(f:[0,1]\to X\) 的函数,一条闭曲线/回路是 \(f:S^1\to X\) 的连续函数。

下面一段直接在道路 \(C,D:X\to Y\) 的意义下说了。

闭曲线 \(C\) 到 \(D\) 存在连续变化,当且仅当存在连续函数 \(F:X\times [0,1]\to Y\),使得 \(F(x,0)=C(x),F(x,1)=D(x)\),此时称 \(C,D\) 同伦。若还满足 \(F(0,x)=C(0)=D(0),F(1,x)=C(1)=D(1)\),这称为定端同伦,记为 \([C]=[D]\)。

定端同伦关系构成等价类,即 \([C]\) 代表和 \(C\) 定端同伦的等价类。

定义道路 \(C(0)=x,C(1)=D(0)=y,D(1)=z\) 的乘积 \(C*D\):把 \(C\) 放在 \([0,0.5]\),\(D\) 放在 \([0.5,1]\),显然还是连续;扩展到等价类上,等价类的 \(*\) 是满足

\[[C]*[D]=[C*D]
\]

的运算。

对于定点 \(z\) 到自己的回路,这样的等价类和 \(*\) 构成群,其中单位元 \(e\mapsto e(x)=z\),而把回路翻转构成了逆元。这称为基本群 \(\pi(X,z)\)。

一个拓扑空间 \(X\) 有强形变收缩核 \(A\subset X\),当 \(e(x)=x\) 和一个连续函数 \(r:X\to A\) 同伦,且同伦函数 \(H\) 满足 \(\forall a\in A,t,H(a,t)=a\)(即 \(A\) 内部不变)。这个同伦把 \([f]\in \pi(X,z)\) 同到了 \([r\circ f]\in \pi(A,z)\)。

这表明 \(\R^2-\{x\}-\{y\}\) 可以收缩到两个 \(S^1\) 在一个点上拼起来,记为 \(S^1\lor S^1\)。显然,\(\R^2-\{x_1,x_2\dots x_n\}\) 可以收缩到 \(S^1\lor S^1\lor\dots \lor S^1\),只需考虑 \(\pi(S^1\lor S^1\lor\dots \lor S^1,z)\) 的结构。

不难看出(?) \(\pi (S^1,z)=\Z\)。而有:

塞弗特-范坎彭定理:\(\pi(A\cup B,z)=\pi(A,z)*\pi(A\cap B,z)*\pi(B,z)\),其中 \(*\) 是群自由积。

所以,\(\pi(S^1\lor S^1\lor\dots \lor S^1,z)=\Z*\Z*\dots *\Z\)。对于本题的条件,记点集为 \(S=\{x_1,x_2,\dots x_n\}\);这可以被看作是 \(x_i\) 及 \(x_i^{-1}\) 构成的串集合。

对于 \(T\subset S\),考虑嵌入 \(\iota :\R^2-S\to \R^2-T\) 及其给出的同态 \(\varphi_{S\to T}:\pi(\R^2-S,z)\to \pi(\R^2-T,z)\),这个同态具体是对于 \(i\not\in T\),\(x_i\) 成为单位元 \(e\),否则不变,而这些 \(i\to T\) 的自由群就是 \(\R^2-T\)。

一个闭曲线是同伦于单位元 \(e\) 的。那么问题变为:

对于一个自由群 \(F(x_1,x_2\dots x_n)\),找出 \(w\in F\),使得 \(\forall T\subset S,[\varphi_{S\to T}(w)=e]=A_T\)。

首先必须满足 \(A_0=1\),并且 \(\forall R\subset T,A_R\ge A_T\)。下面构造展示,这也是充要条件。

记两元素的交换子是 \([x,y]=xyx^{-1}y^{-1}\)。由于同态性,\(\varphi([x,y])=[\varphi(x),\varphi(y)]\)。这有的好性质是 \([e,x]=[x,e]=e\)。

记 \(w_x=x\),\(w_{S}=w_{\{x_1,x_2\dots x_m\}}=[w_x,w_{S-\{x_1\}}]\)。如果限制为 \(A_T=[S\neq T]\),则可构造 \(w_S\) 满足条件(可以归纳验证)。

进一步地,取出极小的 \(A_{R_i}=0\)。则可以验证,

\[\prod_i w_{R_i}
\]

满足条件。总路径长度是 \(O(n3^n)\) 的。

#include<bits/stdc++.h>
using namespace std;
#define pt array<int,2>
struct loop{vector<pt> a;};
loop inv(loop A){reverse(A.a.begin(),A.a.end());return A;}
loop operator *(loop A,loop B){
loop C;
for(auto u:A.a)C.a.push_back(u);
for(int i=1;i<B.a.size();i++)C.a.push_back(B.a[i]);
return C;
}
loop operator ^(loop A,loop B){
return A*B*inv(A)*inv(B);
}
loop w(int x){
loop A;A.a.push_back({0,0});
for(int i=1;i<=x+1;i++)A.a.push_back({i,0});
A.a.push_back({x+1,1});
A.a.push_back({x,1});
for(int i=x;i>=0;i--)A.a.push_back({i,0});
return A;
}
loop w(vector<int> S){
if(S.size()==1)return w(S[0]);
int x=S.back();S.pop_back();
return w(S)^w(x);
}
int A[(1<<6)+5],n;
string str;
vector<int> getS(int x){
vector<int> S;
for(int i=0;i<n;i++)if(x&(1<<i))S.push_back(i);
return S;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>str;
for(int i=0;i<(1<<n);i++)A[i]=str[i]-'0';
int flg=A[0]==1;
for(int i=0;i<(1<<n);i++)for(int j=0;j<(1<<n);j++)if((i&j)==j)flg&=(A[j]>=A[i]);
if(!flg)return cout<<"Impossible"<<endl,0;
cout<<"Possible"<<endl;
loop ans;ans.a.push_back({0,0});
for(int i=0;i<(1<<n);i++){
if(A[i]==1)continue;
bool cf=1;
for(int j=0;j<i;j++)if((i&j)==j&&A[j]==0)cf=0;
if(cf)ans=ans*w(getS(i));
}
cout<<ans.a.size()-1<<endl;
for(auto [x,y]:ans.a)cout<<x<<" "<<y<<endl;
return 0;
}

又快又好写,不知道为什么第一篇点赞更多。

随机推荐

  1. 探究内存泄露—Part1—编写泄露代码

    本文由 ImportNew - 黄索远 翻译自 captaindebug.如需转载本文,请先参见文章末尾处的转载要求. ImportNew注:如果你也对Java技术翻译分享感兴趣,欢迎加入我们的 Ja ...

  2. js之模块导入与导出:export、export default、module.exports、exports

    前两者export.export default可为一组,是es6的规范,和import匹配,import是es6中的语法标准:后两者module.exports.exports可为一组,是commo ...

  3. Ansible 运维自动化

    Ansible 概述Ansbile是一种IT自动化工具.它可以配置系统,部署软件以及协调更高级的IT任务,列如持续部署,滚动更新.Ansible 适用于管理企业IT基础设施,从具有少数主机的小规模到数 ...

  4. 渗透测试-Kioptix Level 1靶机getshell及提权教程

    声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无 ...

  5. 零基础学习人工智能—Python—Pytorch学习(十)

    前言 本文的内容是来自教程视频的第十五集,个人感觉,这个教程是有点虎头蛇尾,就是前面开始的教程,是非常惊人的好,但到这里,就有点水了,可以说就是把代码一铺,然后简单介绍一遍,很多细节都没有讲,所以,我 ...

  6. 解决WSL2无法启动提示“找不到元素”

    最近一段时间没有看 docker desktop,忽然想起来打开看看,结果死活启动不了.以前卸载之后,重新安装就好了,同样的方法尝试了很多次还是不太行,重启也不行... 后来想想是不是 wsl 出了问 ...

  7. 【MyBatis】学习笔记09:动态设置表名

    [Mybatis]学习笔记01:连接数据库,实现增删改 [Mybatis]学习笔记02:实现简单的查 [MyBatis]学习笔记03:配置文件进一步解读(非常重要) [MyBatis]学习笔记04:配 ...

  8. python中replace不能把 \n 替换过去

    问题 简要描述:python中,字符串的 replace 不能把 \n 符号带过去 截图说明 暂时的解决办法 在replace之前,先把要替换的字符串的 \n 去掉

  9. modbus调试助手/mqtt调试工具/超轻巧物联网组件/多线程实时采集/各种协议支持

    一.前言说明 搞物联网开发很多年,用的最多的当属modbus协议,一个稳定好用的物联网组件是物联网平台持续运行多年的基石,所以这个物联网组件从一开始就定位于自研,为了满足各种场景的需求,当然最重要的一 ...

  10. Qt编写可视化大屏电子看板系统20-横向分组图

    一.前言 横向分组图是柱状分组图的横向展示,有了横向柱状图加上分组图的绘制经验,这个做起来就比较简单了,横向的设置规则按照横向柱状图来,分组的规则按照柱状分组图的算法来,在横向的柱子中要绘制对应的值, ...