某考试 T2 orzcyr

非常nice的一道行列式的题目。
考虑如果没有路径不相交这个限制的话,那么这个题就是一个行列式:设 a[i][j] 为从编号第i小的源点到编号第j小的汇点的路径条数,那么矩阵a[][]的行列式就是的答案,因为行列式的定义就是给行一个列的排列,贡献就是所有a[i][p[i]]再乘上 (-1)^(p[] 这个排列的逆序对数).
但是路径不相交就很恶心。。。。根本没法分开算嘛。。。。
不过逆序对可是有一个特殊性质的: 如果把 p[i] 和 p[j] swap一下,那么这个排列的逆序对数的变化值一定是奇数。
这个不难证明,因为仅有权值和下标都在交换的两个数的中间的那些数会产生逆序对变化,但是变化都是双倍的,所以仅有 (p[i].p[j]) 造成了 +/- 1的影响是奇数。
然后我们可以发现两条相交的路径 (a,b) , (c,d) 我们把交点后面的路径 swap 一下,那么就是 (a,d) , (c,b)了,原理就是上述了。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<ctime>
#define ll long long
using namespace std;
const int maxn=605;
int a[maxn][maxn],hd[maxn],num,f[maxn];
int to[maxn*100],ne[maxn*100],X,Y,d[maxn];
int id[maxn],od[maxn],n,m,p,dy[maxn];
int ans=1; inline void addline(int x,int y){ id[y]++,od[x]++,to[++num]=y,ne[num]=hd[x],hd[x]=num;}
inline int add(int x,int y){ x+=y; return x>=p?x-p:x;}
inline void ADD(int &x,int y){ x+=y; if(x>=p) x-=p;}
inline int mul(int x,int y,const int ha){ return x*(ll)y%ha;}
inline int ksm(int x,int y){
int an=1;
for(;y;y>>=1,x=mul(x,x,p)) if(y&1) an=mul(an,x,p);
return an;
} inline void build(int u){
queue<int> q; int x;
for(int i=1;i<=n;i++) if(!id[i]) q.push(i); memcpy(d,id,sizeof(id)); while(!q.empty()){
x=q.front(),q.pop();
// cout<<x<<' '<<f[x]<<endl;
for(int i=hd[x];i;i=ne[i]){
ADD(f[to[i]],f[x]);
if(!(--d[to[i]])) q.push(to[i]);
}
} for(int i=1;i<=n;i++) if(!od[i]) a[u][dy[i]]=f[i];
} inline void xy(){
/*
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++) printf("%d ",a[i][j]);
puts("");
}
*/ for(int i=1,inv,tmp;i<=n;i++){
if(!a[i][i]){
ans=p-ans;
for(int j=i+1;j<=n;j++) if(a[j][i]){
for(int k=i;k<=n;k++) swap(a[i][k],a[j][k]);
break;
}
} ans=mul(ans,a[i][i],p);
inv=ksm(a[i][i],p-2); for(int j=i+1;j<=n;j++) if(a[j][i]){
tmp=a[j][i]*(ll)inv%(const int)p;
for(int k=i;k<=n;k++) ADD(a[j][k],p-mul(a[i][k],tmp,p));
}
}
} inline void solve(){
for(int i=1;i<=n;i++) if(!od[i]) dy[i]=++Y;
for(int i=1;i<=n;i++) if(!id[i]){
memset(f,0,sizeof(f)),f[i]=1;
X++,build(X);
} /*
for(int i=1;i<=X;i++){
for(int j=1;j<=X;j++) printf("%d ",a[i][j]);
puts("");
}
*/ n=X,xy();
} int main(){
freopen("orzcyr.in","r",stdin);
freopen("orzcyr.out","w",stdout); scanf("%d%d%d",&n,&m,&p); int uu,vv;
while(m--) scanf("%d%d",&uu,&vv),addline(uu,vv); solve(); printf("%d\n",ans);
// cout<<X<<' '<<Y<<endl;
return 0;
}
某考试 T2 orzcyr的更多相关文章
- 9.13 考试 T2 区间
删区间 题意: 给出一个长度为
- 某考试T2 frog
题目背景 无 题目描述 数轴上有 n 只青蛙,分别编号为 1 到 n.青蛙 i 的初始位置的坐标为 xi. 它们准备进行如下形式的移动:每轮包括 m 次跳跃,第 i 次跳跃由青蛙 ai(1 < ...
- 某考试 T2 Tree
2 树 2.1 题目描述 给一棵n 个节点的树,节点分别编号为0 到n - 1.你可以通过如下的操作来修改这棵树:首先先删去树上的一条边,此时树会分裂为两个连通块,然后在两个连通块之间加上一条新的边使 ...
- 某考试 T2 yja
2.1 Description 在平面上找 n 个点, 要求这 n 个点离原点的距离分别为 r1, r2, ..., rn. 最大化这 n 个点构成的凸包面积, 凸包上的点的顺序任意. 2.2 Inp ...
- 题解 2020.10.24 考试 T2 选数
题目传送门 题目大意 见题面. 思路 本来以为zcx.pxj变强了,后来发现是SPJ出问题了...考试的时候感觉有点人均啊...结果自己还是只想出来一半. 我们假设 \(f(x)=(\lfloor\f ...
- 2019.3.7考试T2 离线数论??
$ \color{#0066ff}{ 题目描述 }$ 一天,olinr 在 luogu.org 刷题,一点提交,等了一分钟之后,又蛙又替. olinr 发动了他的绝招,说:"为啥啊???&q ...
- 2019.2.26考试T2 矩阵快速幂加速DP
\(\color{#0066ff}{题解 }\) 可以发现, 数据范围中的n特别小,容易想到状压 可以想到类似于状压DP的思路,按列进行转移 那么应该有3维,\(f[i][j][k]\)代表到第i列, ...
- 2019.2.10考试T2, 多项式求exp+生成函数
\(\color{#0066ff}{ 题目描述 }\) 为了减小文件大小,这里不写一堆题目背景了. 请写一个程序,输入一个数字N,输出N个点的森林的数量.点有标号. 森林是一种无向图,要求图中不能存在 ...
- 某考试 T2 Seg
Seg [问题描述]数轴上有n条线段,第i条线段的左端点是a[i],右端点是b[i].Bob发现1~2n共2n个整数点,每个点都是某条线段的端点.这些线段有如下两类特点:1 x y,表示第x条线段和第 ...
随机推荐
- 1040: [ZJOI2008]骑士~基环外向树dp
Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在和平环境中 ...
- eclipse安装反编译插件jadclipse
下载jadClipse地址: 目的:将一些封装的jar或者sdk可以查看源代码 链接: http://pan.baidu.com/s/1kTN4TPd 提取码: 3fvd 将net.sf.jadcl ...
- css做中划线与文字排版
html: <div class="spilt"> <span class="left"></span> < ...
- bzoj3779: 重组病毒 link-cut-tree
题目传送门 这道题看了做了个神转换.....推荐个博客给各位大爷看看吧神犇传送门 代码敲了半天....题目也读了半天 线段树维护的东西很容易和lct混在一起 调了调能过也是很开心啊 运气比较好吧233 ...
- USB接口无法识别设备
http://windows.microsoft.com/zh-cn/windows/answers?tId=14fa1e44-0a19-48ef-9ba7-b7e512a837a4 小琼子 提问 2 ...
- swift网址
http://www.cocoachina.com/industry/20140613/8818.html Swift -- 中文版两大官方文档汇总发布于:2014-06-13 15:34阅读数:22 ...
- UART硬件流控制信号的使用(图)DTR 【转】
UART硬件流控制信号的使用(图) 转自:http://blog.163.com/zy_tommy/blog/static/86926777201321925451164/ 2013-03-19 14 ...
- Multi-Paxos协议日志同步应用
使用Multi-Paxos协议的日志同步与恢复 基于Basic-Paxos协议的日志同步方案, 所有成员的身份都是平等的, 任何成员都可以提出日志持久化的提案, 并且尝试在成员组中进行持久化. 而在实 ...
- phpstorm+xdebug详解
1.run->edit configurations StartUrl最好是网址,不然容易出错,Server选择的是配置时添加的Servers,详可参考:http://www.cnblogs.c ...
- 解决spf13-vim编辑php丢失语法颜色问题
$ vim .vim/bundle/PIV/ftplugin/php.vim //注释掉以下: "call s:InitVariable("g:load_doxygen_synta ...