description

CF578F

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;
}

「CF578F」 Mirror Box的更多相关文章

  1. 「2014-3-13」Javascript Engine, Java VM, Python interpreter, PyPy – a glance

    提要: url anchor (ajax) => javascript engine (1~4 articles) => java VM vs. python interpreter =& ...

  2. 「MoreThanJava」机器指令到汇编再到高级编程语言

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  3. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

  4. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  5. JavaScript OOP 之「创建对象」

    工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...

  6. 「C++」理解智能指针

    维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...

  7. 「JavaScript」四种跨域方式详解

    超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...

  8. 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management

    写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...

  9. 「2014-3-18」multi-pattern string match using aho-corasick

    我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...

随机推荐

  1. Angular双向绑定简单理解

    在使用Antd的时候,一直很好奇里面的双向绑定的自定义组件是怎么做的. 因为之前一直用,没有去细看文档. 今天抽空来简单的撸一下. 在ng中,()是单向数据流,从视图目标到数据源,[()]这样就是双向 ...

  2. Google面试题(选自公众号)

    date: 2018-12-14 13:34:56 updated: 2018-12-14 13:34:56 Google面试题(选自公众号) 问题 把你的手机拨号页想象成一个棋盘.棋子走只能走&qu ...

  3. vue-cli3生产环境和开发环境路径的替换

    在根目录下创建两个文件,这样的好处在于不用手动去书写判断环境替换路径代码 .env.development(开发) .env.production(生产) 内容: 必须是VUE_APP前缀开头,这样w ...

  4. CentOS7 Nginx-1.10.3编译安装

    cat > nginx.sh <<EOF #停止apache,避免抢占端口号 systemctl stop httpd #创建nginx运行账户,非登录用户,不创建家目录 usera ...

  5. 走在深夜的小码农 Fourth Day

    Css3 Fourth Day writer:late at night codepeasant 学习大纲 一.emmet语法 1.简介 ​ Emmet语法的前身是Zen coding,它使用缩写,来 ...

  6. pinpoint部署管理

    本次pinpoint安装使用了docker环境安装,需要预先docker运行环境 1.安装docker环境 2.获取pinpoint-docker,安装命令 git clone https://git ...

  7. Django实现文件上传功能

    文件上传 关注公众号"轻松学编程"了解更多. 1.创建上传文件夹 在static文件夹下创建uploads用于存储接收上传的文件 在settings中配置,MEDIA_ROOT=o ...

  8. day85:luffy:购物车根据有效期不同切换价格&购物车删除操作&价格结算&订单页面前戏

    目录 1.购物车有效期切换 2.根据有效期不同切换价格 3.购物车删除操作 4.价格结算 5.订单页面-初始化 1.购物车有效期切换 1.关于有效期表结构的设计 1.course/models.py ...

  9. 直播带货APP源码开发为什么选择云服务器

    云服务器可以为直播带货APP源码提供弹性计算以及更高的运行效率,避免资源浪费,随着直播带货APP源码业务需求的变化,可以实时扩展或缩减计算资源.CVM支持按实际使用的资源计费,可以节约计算成本. 一. ...

  10. Git常用命令【ZeyFra】

    // 账户设置 git config --global user.name "ZeyFra" git config --global user.email "zeyfra ...