CodeForces 348D Turtles(LGV定理)题解
题意:两只乌龟从1 1走到n m,只能走没有'#'的位置,问你两只乌龟走的时候不见面的路径走法有几种
思路:LGV定理模板。但是定理中只能从n个不同起点走向n个不同终点,那么需要转化。显然必有一只从1, 2走到 n - 1, m,另一只从2, 1走到 n, m - 1。
代码:
#include<cmath>
#include<set>
#include<map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include <iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 3000 + 10;
const int M = maxn * 30;
const ull seed = 131;
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;
char mp[maxn][maxn];
ll dp[maxn][maxn];
ll e[5][5];
ll guass(int n, ll p){
ll ans = 1, f = 1;
for(int i = 1; i <= n; i++){
for(int j = i + 1; j <= n; j++){
int x = i, y = j;
while(e[y][i]){
ll t = e[x][i] / e[y][i];
for(int k = i; k <= n; k++)
e[x][k] = (e[x][k] - e[y][k] * t % p) % p;
swap(x,y);
}
if(x != i){
for(int k = 1; k <= n; k++)
swap(e[i][k], e[j][k]);
f = -f;
}
}
ans = ans * e[i][i] % p;
if(ans == 0) return 0;
}
return (ans * f + p) % p;
}
int main(){
int n, m;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++)
scanf("%s", mp[i] + 1);
memset(dp, 0, sizeof(dp));
dp[1][2] = 1;
for(int i = 1; i <= n; i++){
for(int j = 2; j <= m; j++){
if(i == 1 && j == 2) continue;
if(mp[i][j] == '#') continue;
dp[i][j] = 0;
if(j - 1 >= 1 && mp[i][j - 1] != '#')
dp[i][j] += dp[i][j - 1];
if(i - 1 >= 1 && mp[i - 1][j] != '#')
dp[i][j] += dp[i - 1][j];
dp[i][j] = dp[i][j] % MOD;
}
}
e[1][1] = dp[n - 1][m], e[1][2] = dp[n][m - 1];
memset(dp, 0, sizeof(dp));
dp[2][1] = 1;
for(int i = 2; i <= n; i++){
for(int j = 1; j <= m; j++){
if(i == 2 && j == 1) continue;
if(mp[i][j] == '#') continue;
dp[i][j] = 0;
if(j - 1 >= 1 && mp[i][j - 1] != '#')
dp[i][j] += dp[i][j - 1];
if(i - 1 >= 1 && mp[i - 1][j] != '#')
dp[i][j] += dp[i - 1][j];
dp[i][j] = dp[i][j] % MOD;
}
}
e[2][1] = dp[n - 1][m], e[2][2] = dp[n][m - 1];
printf("%lld\n", guass(2, MOD));
return 0;
}
CodeForces 348D Turtles(LGV定理)题解的更多相关文章
- Codeforces 348D Turtles LGV
Turtles 利用LGV转换成求行列式值. #include<bits/stdc++.h> #define LL long long #define fi first #define s ...
- Codeforces 348D DP + LGV定理
题意及思路:https://www.cnblogs.com/chaoswr/p/9460378.html 代码: #include <bits/stdc++.h> #define LL l ...
- codeforces 348D Turtles
codeforces 348D Turtles 题意 题解 代码 #include<bits/stdc++.h> using namespace std; #define fi first ...
- Codeforces.348D.Turtles(容斥 LGV定理 DP)
题目链接 \(Description\) 给定\(n*m\)的网格,有些格子不能走.求有多少种从\((1,1)\)走到\((n,m)\)的两条不相交路径. \(n,m\leq 3000\). \(So ...
- CodeForces - 348D Turtles(LGV)
https://vjudge.net/problem/CodeForces-348D 题意 给一个m*n有障碍的图,求从左上角到右下角两条不相交路径的方案数. 分析 用LGV算法.从(1,1)-(n, ...
- cf348D. Turtles(LGV定理 dp)
题意 题目链接 在\(n \times m\)有坏点的矩形中找出两条从起点到终点的不相交路径的方案数 Sol Lindström–Gessel–Viennot lemma的裸题? 这个定理是说点集\( ...
- LGV定理 (CodeForces 348 D Turtles)/(牛客暑期多校第一场A Monotonic Matrix)
又是一个看起来神奇无比的东东,证明是不可能证明的,这辈子不可能看懂的,知道怎么用就行了,具体看wikihttps://en.wikipedia.org/wiki/Lindstr%C3%B6m%E2%8 ...
- LGV定理
LGV定理用于解决路径不相交问题. 定理 有 \(n\) 个起点 \(1, 2, 3, ..., n\),它们 分别对应 要到 \(n\) 个终点 \(A, B, C, ..., X\),并且要求路径 ...
- Codeforces Round #182 (Div. 1)题解【ABCD】
Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...
随机推荐
- STL_deque容器
一.deque简介 deque是"double-ended queue"的缩写,和vector一样都是STL的容器,deque是双端数组,而vector是单端的. deque在接口 ...
- Py基础—变量名,条件循环,空执行,编码,运算符,字符比较,简化写法
变量名 只能是字母,数字,下划线.数字不能开头,不要和python内置的东西重复.赋予变量名内容:name1 = "shit" 输出变量名内容 print(name1) 条件语句 ...
- Android iText向pdf模板插入数据和图片
一.需求 这些日志在写App程序,有这么一个需求,就是需要生成格式统一的一个pdf文件,并向固定表格中填充数据,并且再在pdf中追加两页图片. 二.方案 手工设计一个pdf模板,这个具体步骤就不再赘述 ...
- Vue 标签Style 动态三元判断绑定
<div :style=" 1==1 ? 'display:block' : 'display:none' "></div> v-bind:style 的 ...
- JavaScript中的迭代器和生成器[未排版]
JavaScript中的迭代器 在软件开发领域,"迭代"的意思是按照顺序反复多次执行一段程序,通常会有明确的终止条件. ECMAScript 6规范新增了两个高级特性:迭代器和生成 ...
- 不错的网站压力测试工具webbench
webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好,安装使用也特别方便. 1.适用系统:Linux 2.前期准备:yum install ...
- autocommit 隔离级别 next lock gap lock 事务隔离级别和锁
autocommit 隔离级别 https://www.ibm.com/developerworks/cn/opensource/os-mysql-transaction-isolation-leve ...
- python_3 装饰器之初次见面
装饰器 定义:本质是函数,(只不过是用来装饰其他函数而已),就是为其他函数添加附加功能 原则: 1. 不能修改被修饰函数的源代码 2.不能修改被修饰函数的调用方式 实现装饰器的知识储备 1.函数即&q ...
- var、let、const之间的区别
var声明变量可以重复声明,而let不可以重复声明var是不受限于块级的,而let是受限于块级var会与window相映射(会挂一个属性),而let不与window相映射var可以在声明的上面访问变量 ...
- pycharm创建文件夹以及查看源文件存放位置(FOR MAC)
1.首先我们打开pycharm软件,一般首次打开界面如下 2.我们点击creat new project,点击后效果如下,此时创建相应的文件夹 3.创建完成后如下,并可以查看存放文件夹的位置 4.完成 ...