「CodePlus 2017 12 月赛」白金元首与独舞
description
data range
\]
solution
矩阵树定理
求无向图的生成树个数
度数矩阵-邻接矩阵
去掉一行一列求行列式
为了保证精度可以辗转相除
这里是模意义下的
const int mod=998244353;
int a[305][305];
il int gauss(int n){
	RG int ans=1;
	for(RG int i=2;i<=n;i++){
		for(RG int j=i+1;j<=n;j++)
			while(a[j][i]){
				RG int t=a[i][i]/a[j][i];
				for(RG int k=i;k<=n;k++)dec(a[i][k],1ll*t*a[j][k]%mod);
				swap(a[i],a[j]);if(ans)ans=mod-ans;
			}
		ans=1ll*ans*a[i][i]%mod;
	}
	if(ans<0)ans+=mod;return ans;
}
有向图的外向(父亲指向儿子)生成树个数
对于每条边\((u,v)\),\(a[v][v]++,a[u][v]--\)(把度数看成入度)
然后直接求行列式即可
这题的解法
首先判掉无解
然后我们发现题目中每个空格方向的选择决定了空格之间的到达关系
于是这道题目变成了一个求内向生成树个数的题
套上矩阵树定理即可
code
#include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<iomanip>
#include<cstring>
#include<complex>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<ctime>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define FILE "a"
#define mp make_pair
#define pb push_back
#define RG register
#define il inline
using namespace std;
typedef unsigned long long ull;
typedef vector<int>VI;
typedef long long ll;
typedef double dd;
const dd eps=1e-10;
const int mod=1e9+7;
const int N=2000010;
const dd pi=acos(-1);
const int inf=2147483645;
const ll INF=1e18+1;
const ll P=100000;
il ll read(){
	RG ll data=0,w=1;RG char ch=getchar();
	while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
	if(ch=='-')w=-1,ch=getchar();
	while(ch<='9'&&ch>='0')data=data*10+ch-48,ch=getchar();
	return data*w;
}
il void file(){
	srand(time(NULL)+rand());
	freopen(FILE".in","r",stdin);
	freopen(FILE".out","w",stdout);
}
int n,m,p[305][305],kx[305],ky[305];
int id[305][305],tag[305][305],t[100010],cnt,tot;
int a[305][305];
int dx[]={0,0,-1,1},dy[]={-1,1,0,0};
il void init(){
	memset(id,0,sizeof(id));
	memset(tag,0,sizeof(tag));
	memset(t,0,sizeof(t));
	memset(a,0,sizeof(a));
	n=read();m=read();tot=1;cnt=0;
	for(RG int i=1,c;i<=n;i++)
		for(RG int j=1;j<=m;j++){
			a[i][j]=tag[i][j]=id[i][j]=c=0;
			while(c!='L'&&c!='R'&&c!='U'&&c!='D'&&c!='.')c=getchar();
			if(c=='L')p[i][j]=0;if(c=='R')p[i][j]=1;
			if(c=='U')p[i][j]=2;if(c=='D')p[i][j]=3;
			if(c=='.'){p[i][j]=4;id[i][j]=++tot;kx[tot]=i;ky[tot]=j;}
		}
}
il bool work(){
	for(RG int i=1;i<=n;i++)
		for(RG int j=1;j<=m;j++)
			if(!id[i][j]&&!tag[i][j]){
				RG int x=i,y=j,w=p[i][j];cnt++;
				RG int xx=x+dx[w],yy=y+dy[w];
				while(!id[x][y]&&!tag[x][y]&&x>0&&y>0&&x<=n&&y<=m){
					tag[x][y]=cnt;x=xx;y=yy;w=p[x][y];xx=x+dx[w];yy=y+dy[w];
				}
				if(id[x][y])t[cnt]=id[x][y];
				else if(x<1||y<1||x>n||y>m)t[cnt]=1;
				else if(tag[x][y]==cnt)return 0;
				else if(tag[x][y])t[cnt]=t[tag[x][y]];
			}
	return 1;
}
il void upd(int &a,int b){a+=b;if(a>=mod)a-=mod;}
il void dec(int &a,int b){if(b)upd(a,mod-b);}
il int gauss(int n){
	RG int ans=1;
	for(RG int i=2;i<=n;i++){
		for(RG int j=i+1;j<=n;j++)
			while(a[j][i]){
				RG int t=a[i][i]/a[j][i];
				for(RG int k=i;k<=n;k++)dec(a[i][k],1ll*t*a[j][k]%mod);
				swap(a[i],a[j]);if(ans)ans=mod-ans;
			}
		ans=1ll*ans*a[i][i]%mod;
	}
	if(ans<0)ans+=mod;return ans;
}
il int solve(){
	for(RG int i=2;i<=tot;i++)
		for(RG int w=0;w<=3;w++){
			RG int xx=kx[i]+dx[w],yy=ky[i]+dy[w];
			RG int u=t[tag[xx][yy]],v=i;
			if(id[xx][yy])u=id[xx][yy];
			if(xx<1||yy<1||xx>n||yy>m)u=1;
			if(u==v||!u)continue;
			a[v][v]++;if(!a[u][v])a[u][v]=mod;a[u][v]--;
		}
	return gauss(tot);
}
int main()
{
	RG int T=read();
	while(T--){
		init();
		if(!work()){puts("0");continue;}
		else printf("%d\n",solve());
	}
	return 0;
}
「CodePlus 2017 12 月赛」白金元首与独舞的更多相关文章
- [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞
		[LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞 试题描述 到河北省 见斯大林 / 在月光下 你的背影 / 让我们一起跳舞吧 うそだよ~ 河北省怎么可能有 Stalin. ... 
- 【LibreOJ】#6259. 「CodePlus 2017 12 月赛」白金元首与独舞
		[题目]给定n行m列的矩阵,每个位置有一个指示方向(上下左右)或没有指示方向(任意选择),要求给未定格(没有指示方向的位置)确定方向,使得从任意一个开始走都可以都出矩阵,求方案数.n,m<=20 ... 
- 走进矩阵树定理--「CodePlus 2017 12 月赛」白金元首与独舞
		n,m<=200,n*m的方阵,有ULRD表示在这个格子时下一步要走到哪里,有一些待决策的格子用.表示,可以填ULRD任意一个,问有多少种填法使得从每个格子出发都能走出这个方阵,答案取模.保证未 ... 
- loj6259「CodePlus 2017 12 月赛」白金元首与独舞
		分析 我们将没连的点连向周围四个点 其余的按照给定的方向连 我们将所有连出去的位置统一连到0点上 再以0作为树根 于是就将问题转化为了有向图内向树计数 代码 #include<iostream& ... 
- 「CodePlus 2017 12 月赛」火锅盛宴(模拟+树状数组)
		1A,拿来练手的好题 用一个优先队列按煮熟时间从小到大排序,被煮熟了就弹出来. 用n个vector维护每种食物的煮熟时间,显然是有序的. 用树状数组维护每种煮熟食物的数量. 每次操作前把优先队列里煮熟 ... 
- 「CodePlus 2017 12 月赛」可做题2(矩阵快速幂+exgcd+二分)
		昨天这题死活调不出来结果是一个地方没取模,凉凉. 首先有个一眼就能看出来的规律... 斐波那契数列满足$a_1, a_2, a_1+a_2, a_1+2a_2, 2a_1+3a_2, 3a_1+5a_ ... 
- 【LibreOJ】#6299. 「CodePlus 2018 3 月赛」白金元首与克劳德斯
		[题意]给出坐标系中n个矩形,类型1的矩形每单位时间向x轴正方向移动1个单位,类型2的矩形向y轴正方向,初始矩形不重叠,一个点被矩形覆盖当且仅当它在矩形内部(不含边界),求$(-\infty ,+\i ... 
- 【LIbreOJ】#6256. 「CodePlus 2017 12 月赛」可做题1
		[题意]定义一个n阶正方形矩阵为“巧妙的”当且仅当:任意选择其中n个不同行列的数字之和相同. 给定n*m的矩阵,T次询问以(x,y)为左上角的k阶矩阵是否巧妙.n,m<=500,T<=10 ... 
- 【LibreOJ】#6257. 「CodePlus 2017 12 月赛」可做题2
		[题意]数列满足an=an-1+an-2,n>=3.现在a1=i,a2=[l,r],要求满足ak%p=m的整数a2有多少个.10^18. [算法]数论(扩欧)+矩阵快速幂 [题解]定义fib(i ... 
随机推荐
- Java:二进制(原码、反码、补码)与位运算
			一.二进制(原码.反码.补码) 二进制的最高位是符号位(“0”代表正数,“1”代表负数): Java中没有无符号数: 计算机以整数的补码进行运算: 1. 原码:将一个整数转换成二进制表示 以 int ... 
- PostgreSQL 使用总结
			1. USING的使用 USING是个缩写的概念:它接收一个用逗号分隔的字段名字列表, 这些字段必须是连接表共有的,最终形成一个连接条件,表示这些字段对必须相同. USING (a, b, c) 等效 ... 
- Java并发编程系列一:Future和CompletableFuture解析与使用
			一.Future模式 Java 1.5开始,提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果. Future接口可以构建异步应用,是多线程开发中常见的设计模式. 当 ... 
- jquery 点滴
			jQuery——动态给表格添加序号 $(function(){ //$('table tr:not(:first)').remove(); var len = $('table tr').length ... 
- WeTest功能优化第1期:截图960px,云真机映射功能了解
			第1期功能优化目录 [全线产品测试截图优化]安卓机型测试截图分辨率上升至960px [云真机新增Android 9]最新安卓系统,等你pick [云真机新增键盘映射功能]电脑键盘码字,云真机同步显示 ... 
- ElasticSearch-Java-low-level-rest-client官方文档翻译
			人肉翻译,非谷歌机翻,部分地方添加了个人的理解,并做了分割,如有错误请在评论指出.转载请指明原链接,尊重个人劳动成果. High-Level-Rest-Client基于Low-Level ... 
- uvaoj1339 - Ancient Cipher(思维题,排序,字符串加密)
			https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ... 
- Windows运行机理——窗口和句柄
			Windows运行机理这系列文章都是来至于<零基础学Qt4编程>——吴迪,个人觉得写得很好,所以进行了搬运和个人加工 1. 窗口 窗口是Windows应用程序中一个非常重要的元素,一个Wi ... 
- WEB中间件漏洞--IIS
			1.iis安装 版本 一直下一步,选上iis安装 端口修改 网站目录 通过网站发布目录(发布目录任意),新建index.html页面,可以正常访问 2.iis6.0解析漏洞 (1)文件名解析 IIS在 ... 
- CTC (Connectionist Temporal Classification) 算法原理
			(原创文章,转载请注明出处哦~) 简单介绍CTC算法 CTC是序列标注问题中的一种损失函数. 传统序列标注算法需要每一时刻输入与输出符号完全对齐.而CTC扩展了标签集合,添加空元素. 在使用扩展标签集 ... 
