hdu 5852 :Intersection is not allowed! 行列式
有K个棋子在一个大小为N×N的棋盘。一开始,它们都在棋盘的顶端,它们起始的位置是 (1,a1),(1,a2),...,(1,ak) ,它们的目的地是 (n,b1),(n,b2),...,(n,bk)。
一个位于 (r,c) 的棋子每一步只能向右走到 (r,c+1) 或者向下走到 (r+1,c) 。
我们把 i 棋子从 (1,ai) 走到 (n,bi) 的路径记作 pi 。
你的任务是计算有多少种方案把n个棋子送到目的地,并且对于任意两个不同的棋子 i,j ,使得路径 pi 与 pj 不相交(即没有公共点)。
容斥原理。
假设只有两个点,那么答案就是它们以任意路径到达终点的方案数减去相交的方案。
比如 a1->b1 ,a2->b2 ,那它们相交的方案就是 a1->b2,a2->b1的所有方案。
因为在最后一个交点下把两条路径换一下它们是一一对应的。
扩展到多个点时有$n!$种向下对应对应的方案,每个方案的容斥系数是$-1^{逆序对个数}$。
实际上这东西就是矩阵的行列式。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define N 105
using namespace std;
int n,k;
const int inf = ;
const int p = ;
int jie[],ni[];
void yu()
{
jie[]=ni[]=ni[]=;
for(int i=;i<=inf;i++)jie[i]=1LL*i*jie[i-]%p;
for(int i=;i<=inf;i++)ni[i]=(1LL*(-p/i)*ni[p%i]%p+p)%p;
for(int i=;i<=inf;i++)ni[i]=1LL*ni[i-]*ni[i]%p;
}
int pw(ll x,int y)
{
ll lst=;
while(y)
{
if(y&)lst=lst*x%p;
y>>=;
x=1LL*x*x%p;
}
return (int)lst;
}
int c(int n,int m)
{
return 1LL*jie[n]*ni[m]%p*ni[n-m]%p;
}
int st[N],ed[N];
ll a[N][N];
void guess()
{
ll ans=;
for(int i=;i<=k;i++)
{
for(int j=i;j<=k;j++)
{
if(a[j][i])
{
if(j!=i)ans*=-;
for(int l=;l<=k;l++)swap(a[i][l],a[j][l]);
break;
}
}
ll tp=pw(a[i][i],p-);
for(int j=i+;j<=k;j++)
{
if(a[j][i])
{
ll tmp=p-tp*a[j][i]%p;
for(int l=i;l<=k;l++)
{
a[j][l]=(a[j][l]+tmp*a[i][l]%p)%p;
}
}
}
}
if(ans==-)ans=p-;
for(int i=;i<=k;i++)ans=ans*a[i][i]%p;
printf("%lld\n",ans);
return ;
}
int main()
{
yu();
scanf("%d%d",&n,&k);
for(int i=;i<=k;i++)scanf("%d",&st[i]);
for(int i=;i<=k;i++)scanf("%d",&ed[i]);
for(int i=;i<=k;i++)
{
for(int j=;j<=k;j++)
{
if(ed[j]>=st[i])a[i][j]=c(n-+abs(ed[j]-st[i]),n-);
}
}
guess();
return ;
}
hdu 5852 :Intersection is not allowed! 行列式的更多相关文章
- HDU 5852 Intersection is not allowed!(LGV定理行列式求组合数)题解
题意:有K个棋子在一个大小为N×N的棋盘.一开始,它们都在棋盘的顶端,它们起始的位置是 (1,a1),(1,a2),...,(1,ak) ,它们的目的地是 (n,b1),(n,b2),...,(n,b ...
- HDU 5852 Intersection is not allowed! ( 2016多校9、不相交路径的方案、LGV定理、行列式计算 )
题目链接 题意 : 给定方格中第一行的各个起点.再给定最后一行与起点相对应的终点.问你从这些起点出发到各自的终点.不相交的路径有多少条.移动方向只能向下或向右 分析 : 首先对于多起点和多终点的不相交 ...
- hdu5852 Intersection is not allowed! 【矩阵行列式】
题意 给出\(n*n\)网格\((n<=10^5)\) 顶部有\(K\)个起点,底部有\(K\)个相对应的终点 每次只能向下或向右走 求有多少种从各个起点出发到达对应终点且路径不相交的路径? 对 ...
- hdu 5120 Intersection
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5120 A ring is a 2-D figure bounded by two circles sh ...
- hdu 5120 Intersection 圆环面积交
Intersection Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5 ...
- HDU 5120 Intersection(2014北京赛区现场赛I题 计算几何)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5120 解题报告:给你两个完全相同的圆环,要你求这两个圆环相交的部分面积是多少? 题意看了好久没懂.圆环 ...
- 计算几何(容斥原理,圆交):HDU 5120 Intersection
Matt is a big fan of logo design. Recently he falls in love with logo made up by rings. The followin ...
- hdu 5120 Intersection 两个圆的面积交
Intersection Time Limit: 4000/4000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Others) P ...
- HDU5852 Intersection is not allowed!
There are K pieces on the chessboard. The size of the chessboard is N*N. The pieces are initially pl ...
随机推荐
- 局域网arpspoof欺骗获取cookie/图片/密码
开启路由转发功能 查看IP转发功能是否打开 默认是不开起,0,我这里是修改后的,显示1. 修改转发功能,1为允许. 修改成功后再进行Arpspoof欺骗 如果开始劫持后,自己电脑无法联网了 ??? 检 ...
- Python模块xlwt对excel进行写入操作
python常用模块目录 1.安装 $ pip install xlwt 2.创建表格和工作表单写入内容 例子: import xlwt # 创建一个workbook 设置编码 workbook = ...
- js备忘录3
JavaScript也有类型转换 js中的获取指定位数的方法 +和-的转换方向不同 在JavaScript中首先给变量赋值数字,然后再给变量赋值字符串是合法的 这点和Java有些区别 在函数体内声明变 ...
- 基于spec评论作品
组名:杨老师粉丝群 组长:乔静玉 组员:吴奕瑶 刘佳瑞 公冶令鑫 杨磊 杨金铭 张宇 卢帝同 一.测试目标:拉格朗日2018——飞词 下面是他们的小游戏在运行时的一些截图画面: 1.开始: ...
- java 实验一
步骤 耗时h 百分比% 需求分析 0.3h 7.5 设计 2.5h 62.5 代码实现 0.5h 12.5 测试 0,2h 5 分析总结 0.5h 12.5 实验一 截图 实验二: 实验三 实现 ...
- 《Spring1之第七次站立会议》
<第七次站立会议> 昨天:我把自己项目工程里的服务器端界面进行了优化和完善. 今天:我查找了关于实现视频功能的相关代码. 遇到的问题:找到的都是基于C#的相关代码,很难找到用java实现的 ...
- Teamwork(The sixth day of the team)
每日列会过后,我们的工作进度都有所进展了,好开心,但是还不是我们想要的,我们想做得更快,更好.
- 将url的参数解析为Json数据
代码如下: <!DOCTYPE> <html lang="en"> <head> </head> <body> < ...
- Linux操作系统(二)
SSD工作原理:http://www.360doc.com/content/15/0318/15/16824943_456186965.shtml HHD工作原理:http://blog.csdn.n ...
- grunt入门讲解7:项目脚手架grunt-init
grunt-init是一个用于自动创建项目脚手架的工具.它会基于当前工作环境和你给出的一些配置选项构建一个完整的目录结构.至于其所生成的具体文件和内容,依赖于你所选择的模版和构建过程中你对具体信息所给 ...