uoj#279. 【UTR #2】题目交流通道(容斥+数数)
先考虑无解的情况,为以下几种:\(dis_{i,j}+dis_{j,k}<dis_{i,k}\),\(dis_{i,i}\neq 0\),\(dis_{i,j}\neq dis_{j,i}\),\(dis_{i,j}>K\)。先大力特判掉
然后来考虑没有边权为\(0\)的时候,把原图中所有的边分类,对于\((i,j)\),如果存在\(k\)使得\(dis_{i,k}+dis_{k,j}=dis_{i,j}\),那么称其为\(B\)类边,否则为\(A\)类边。显然\(A\)类边的权值就是\(dis_{i,j}\),因为从其他地方走权值都大于自己。然后大力猜想一发对于所有\(B\)类边,权值可以取\([dis_{i,j},K]\)之间的数,接下来证明它
因为存在一条路径从\(i\)到\(j\)且权值为\(dis_{i,j}\),那么这条路径\(F\)上的边数大于等于\(2\),如果其上都是\(A\)类边,那么就算所有\(B\)取值为\(K\)也没关系。那么反证,假设其上有一条边为\(B\)类边,那么这条\(B\)类边也有对应一条与它权值相等的路径\(G\)。\(G\)不可能与\(F\)有任何一条边重复,否则我们可以在\(F\)上不走那条\(B\)边而是走\(G\),那么少走了重复的那几条边,路径权值会变小,与\(F\)是最短路矛盾
综上,所有\(A\)类边取值固定,\(B\)类边可以取\([dis_{i,j},K]\)之间的边,判断一下边的类型,用乘法原理统计答案就好了
信心满满交上去结果只有\(30\)分,发现自己忘记考虑边权为\(0\)的情况了
如果有边权为\(0\),那么我们可以把这两个点缩成一个点,而且不难发现最短路为\(0\)是具有传递性的,所以我们可以把互相之间最短路为\(0\)的点缩到一起,记其中点的个数为\(size_i\),缩完点之后的图就是没有边权为\(0\)的情况了
考虑一个连通块内部,如果把\(0\)边当成实边,那么\(0\)边需要让所有的点联通,而其它的边的取值无所谓。记\(f_i\)为\(i\)个点的连通块中\(0\)边使所有点联通的方案数,那么有$$f_i=(K+1){C_{i}2}-\sum_{j=1}{i-1}K{(i-j)\times j}(K+1){C_{i-j}2}C_{i-1}^{j-1}f_j$$
上面的式子的意思就是,总共的方案减去不合法的方案,不合法的方案可以枚举与\(1\)同一个联通快的点的大小\(j\),那么内部的方案就是\(f_j\),然后\(j\)和\(i-j\)之间的边能为\(0\),\(i-j\)内部随便连
上面是连通块的贡献,然后考虑边的贡献,设一条边连接的两个连通块大小分别为\(i,j\),两个连通块之间的最短路长度为\(d\),如果这条边是\(B\)类边,那么方案数就是\((K-d+1)^{i\times j}\),如果是\(A\)类边,就是\((K-d+1)^{i\times j}-(K-d)^{i\times j}\)即合法的减去不合法的
然后就没有然后了
//minamoto
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
const int N=505,P=998244353;
inline int add(R int x,R int y){return x+y>=P?x=y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){
R int res=1;
for(;y;y>>=1,x=mul(x,x))if(y&1)res=mul(res,x);
return res;
}
int a[N][N],vis[N][N],fa[N],f[N],fac[N],inv[N],sz[N];
int n,K,res=1;
inline int C(R int n,R int m){if(m>n)return 0;return mul(fac[n],mul(inv[m],inv[n-m]));}
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
bool ck(){
fp(i,1,n)if(a[i][i]!=0)return false;
fp(i,1,n)fp(j,i+1,n){
if(a[i][j]!=a[j][i])return false;
if(a[i][j]>K)return false;
fp(k,1,n)if(a[i][j]+a[j][k]<a[i][k])return false;
}return true;
}
void init(){
inv[0]=fac[0]=1;fp(i,1,n)fac[i]=mul(fac[i-1],i);
inv[n]=ksm(fac[n],P-2);fd(i,n-1,1)inv[i]=mul(inv[i+1],i+1);
fp(i,1,n)fa[i]=i;
fp(i,1,n)fp(j,i+1,n)if(a[i][j]==0)fa[find(j)]=find(i);
fp(i,1,n)++sz[find(i)];
fp(i,1,n){
f[i]=ksm(K+1,C(i,2));
fp(j,1,i-1)f[i]=dec(f[i],1ll*ksm(K,j*(i-j))*ksm(K+1,C(i-j,2))%P*C(i-1,j-1)%P*f[j]%P);
}
}
int main(){
// freopen("testdata.in","r",stdin);
n=read(),K=read();
fp(i,1,n)fp(j,1,n)a[i][j]=read();
if(!ck())return puts("0"),0;
init();
fp(i,1,n)find(i);
fp(i,1,n)if(fa[i]==i)
fp(j,i+1,n)if(fa[j]==j){
bool flag=0;
fp(k,1,n)if(fa[k]==k)
if(k!=i&&k!=j&&a[i][k]+a[j][k]==a[i][j]){flag=1;break;}
if(flag)res=mul(res,ksm(K-a[i][j]+1,sz[i]*sz[j]));
else res=mul(res,dec(ksm(K-a[i][j]+1,sz[i]*sz[j]),ksm(K-a[i][j],sz[i]*sz[j])));
}
fp(i,1,n)if(find(i)==i)res=mul(res,f[sz[i]]);
printf("%d\n",res);
return 0;
}
uoj#279. 【UTR #2】题目交流通道(容斥+数数)的更多相关文章
- 【UTR #2】[UOJ#278]题目排列顺序 [UOJ#279]题目交流通道 [UOJ#280]题目难度提升
[UOJ#278][UTR #2]题目排列顺序 试题描述 “又要出题了.” 宇宙出题中心主任 —— 吉米多出题斯基,坐在办公桌前策划即将到来的 UOI. 这场比赛有 n 道题,吉米多出题斯基需要决定这 ...
- UOJ279 【UTR #2】题目交流通道
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump ...
- 【UTR #2】题目交流通道
题目描述 定好了难度,雄心勃勃的吉米多出题斯基开始寻找智慧的神犇星球的居民出题. 然而吉米多出题斯基没有料到,神犇星球的居民告诉吉米多出题斯基:"今年神犇星球经济不景气,大家都想宅在家里,哪 ...
- uoj279 题目交流通道
题目:告诉你每两个点之间的最短路距离.构造每条边边权<=m的无向完全图.求有多少种不同边权的图满足最短路限制?n<=400. 标程: #include<cstdio> #inc ...
- 【UOJ #279】【UTR #2】题目交流通道
http://uoj.ac/problem/279 先判断答案为0的情况,\(d(i,i)\neq 0\),\(d(i,j)\neq d(j,i)\),\(d(i,j)>d(i,k)+d(k,j ...
- uoj279题目交流通道(dp)
题目大意: 神犇星球有 \(n\) 座小城.对于任意两座小城 \(v,u\)\((v≠u)\),吉米多出题斯基想在 \(v,u\) 之间建立一个传送时间为 \(w(v,u)\)的无向传送通道,其中 \ ...
- UOJ #214 合唱队形 (概率期望计数、DP、Min-Max容斥)
9个月的心头大恨终于切掉了!!!! 非常好的一道题,不知为何uoj上被点了70个差评. 题目链接: http://uoj.ac/problem/214 题目大意: 请自行阅读. 题解: 官方题解讲得相 ...
- 【UOJ#422】【集训队作业2018】小Z的礼物(min-max容斥,轮廓线dp)
[UOJ#422][集训队作业2018]小Z的礼物(min-max容斥,轮廓线dp) 题面 UOJ 题解 毒瘤xzy,怎么能搬这种题当做WC模拟题QwQ 一开始开错题了,根本就不会做. 后来发现是每次 ...
- 【UOJ#390】【UNR#3】百鸽笼(动态规划,容斥)
[UOJ#390][UNR#3]百鸽笼(动态规划,容斥) 题面 UOJ 题解 发现这就是题解里说的:"火山喷发概率问题"(大雾 考虑如果是暴力的话,你需要记录下当前每一个位置的鸽笼 ...
随机推荐
- POJ1226 Substrings ——后缀数组 or 暴力+strstr()函数 最长公共子串
题目链接:https://vjudge.net/problem/POJ-1226 Substrings Time Limit: 1000MS Memory Limit: 10000K Total ...
- ubuntu 14.4 下 普通sudo无密码
用户是test,要设置为 sudo无密码 visudo 最后一行 加上: %test ALL=NOPASSWD:ALL 然后 ctrl + x 进行保存,会提示 Y or N,输入 y 即可. ...
- (5)表单Action后台验证
/day31/src/cn/itcast/web/struts2/user/UserAction.java package cn.itcast.web.struts2.user; import com ...
- 标准兼容HTML5输入框提示信息的插件iHolder_v0.1.06.21.2014_预览版
由于版面限制,简单说下,详细的内容及在线预览.预览版压缩包,见这里http://levi.cg.am/archives/3507 为什么说是标准兼容: 因为大多数placeholder插件是这样兼容的 ...
- hdu 4704 sum(费马小定理+快速幂)
题意: 这题意看了很久.. s(k)表示的是把n分成k个正整数的和,有多少种分法. 例如: n=4时, s(1)=1 4 s(2)=3 1,3 3,1 2,2 s ...
- UML中的6大关系详细说明
UML中的6大关系详细说明: 1.关联关系: 含义:类与类之间的连结,关联关系使一个类知道另外一个类的属性和方法:通常含有“知道”,“了解”的含义 体现:在C#中,关联关系是通过成员变量来实现的: 方 ...
- 改变Ecplise项目窗口字体样式
Eclipse\plugins\org.eclipse.ui.themes_1.1.1.v20151026-1355\css e4-dark_win.css CTabFolder Tree, CTab ...
- ls命令还能这么玩
排序文件大小: 我们希望以文件大小排序,我们可以使用-S 参数来这么做 如果希望文件大小从小到大排序: 如果只希望列出目录条目: 增加 /(斜线) 标记目录:要这么做,使用-p选项: 通过修改时间列出 ...
- 编写html页面时常见的问题(二)
这次我接着说几个编写页面时常见的另外几个问题. 不能水平居中对齐 在我们写页面的时候,会遇到一些小细节就是不能水平居中对齐,这种情况影响了页面的美观,这也是写页面的质量不过关的一个体现,其实这种情况的 ...
- vue实现图片的上传和删除
目录 1 UI库使用ElementUI 2 后端使用Express + formidable模块 1 UI库使用ElementUI 安装ElementUI $ npm install --save-d ...