「CF578F」 Mirror Box
2024-08-26 21:47:06
description
solution
- 考虑转化题目的要求
1.对于任意一条边,都存在一条从界垂直射入的光线,经过反射穿过这条边。
当图中有环时,环内的边一定不满足条件,而在不存在环时感性理解一下就能满足条件
2.从任意一条界垂直射入的光线经过反射,从相邻的一条界射出;
对于这个条件,因为光路可逆,所以我们需要将图中的边两两分组,并用镜子将他们围住 - 多画几张图后,你就会发现:将图中点黑白染色后,答案一定包括一个黑色点或者白色点的生成树,并且再确定这棵树后,剩下的镜子选法只有一种
- 于是上矩阵树定理即可
code
#include<bits/stdc++.h>
using namespace std;
const int N=310;
int n,m,p,fa[N*N];
char s[N][N];
inline int id(int x,int y){return (x-1)*(m+1)+y;}
inline int find(int x){return fa[x]==x?x:fa[x]=fa[fa[x]]=fa[fa[fa[x]]]=find(fa[fa[fa[x]]]);}
inline void merge(int x,int y){x=find(x);y=find(y);x!=y?fa[x]=y:0;}
int a[2][N<<2][N<<2],tot[2],bel[N*N];
inline int add(int p,int x,int y){
++a[p][bel[x]][bel[x]];++a[p][bel[y]][bel[y]];
--a[p][bel[x]][bel[y]];--a[p][bel[y]][bel[x]];
}
inline int inv(int a,int b=p-2){
int ret=1;
while(b){
if(b&1) ret=1ll*ret*a%p;
a=1ll*a*a%p;b>>=1;
}
return ret;
}
inline int matrix_tree(int pt,int x){
int ans=1;
for(int j=1;j<=x;++j){
for(int i=j+1;i<=x;++i){
if(a[pt][i][j]){
int d=1ll*a[pt][j][j]*inv(a[pt][i][j])%p;
for(int k=j;k<=x;++k) a[pt][j][k]=(a[pt][j][k]-1ll*d*a[pt][i][k]%p+p)%p;
swap(a[pt][i],a[pt][j]);ans=-ans;
}
}
ans=1ll*ans*a[pt][j][j]%p;
if(ans<0) ans+=p;
}
return ans;
}
int main(){
scanf("%d%d%d",&n,&m,&p);
for(int i=1;i<=(n+1)*(m+1);++i) fa[i]=i;
for(int i=1;i<=n;++i){
scanf("%s",s[i]+1);
for(int j=1;j<=m;++j){
if(s[i][j]=='/') merge(id(i+1,j),id(i,j+1));
else if(s[i][j]!='。') merge(id(i,j),id(i+1,j+1));
}
}
for(int i=1;i<=n+1;++i)
for(int j=1;j<=m+1;++j)
if(fa[id(i,j)]==id(i,j)){
int wh=(i+j)&1;
bel[id(i,j)]=++tot[wh];
}
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
if(s[i][j]=='*'){
add((i+1+j)&1,find(id(i+1,j)),find(id(i,j+1)));
add((i+j)&1,find(id(i,j)),find(id(i+1,j+1)));
}
}
}
printf("%d\n",(matrix_tree(0,tot[0]-1)+matrix_tree(1,tot[1]-1))%p);
return 0;
}
最新文章
- canvas绘图、WebGL、SVG
- Diccuz!NT的dll版本号控制技巧
- opencms忘记Admin用户登录密码解决方案
- flask中&#39;bool&#39; object has no attribute &#39;__call__&#39;问题
- Linux下安装配置Node及memcached
- centos7 下载eclipse的镜像站点
- HTTP的报文格式,GET和POST的区别
- I - Strategic Game - hdu 1054(最小点覆盖)
- dlmalloc 2.8.6 源代码具体解释(6)
- 《Machine Learning》系列学习笔记之第三周
- Linux,activemq-cpp之消息过滤器
- linux运维、架构之路-Zabbix监控应用及分布式
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题&;&;学习笔记】
- HTML5进阶(三)HBuilder实现软件自动升级(优化篇)
- 新系统添加sshkey/pexpect基本使用
- day26 Python __getattribute__
- wampserver本地配置域名映射
- NodeJS Web模块
- sqlalchemy基本使用
- UVALive-3263 That Nice Euler Circuit (几何欧拉定理)
热门文章
- altium designer使用小技巧,记录
- 云计算管理平台之OpenStack网络服务neutron
- NB-IoT成为3GPP后会有哪些优势
- Java学习的第四十三天
- Spring创建Bean的过程Debug
- 5G应用的实时决策
- 洛谷 P2391 白雪皑皑 线段树+优化
- 842. Split Array into Fibonacci Sequence —— weekly contest 86
- EntityFramework Core上下文实例池原理分析
- Efficient Estimation of Word Representations in Vector Space 论文笔记