STREAMING #5 题解 3.高位网络
高维网络
【题目描述】
现在有一个 d 维的坐标网格,其中第 i 维坐标的范围是[0,a_i]。在这个范围内建立一个有向图:我们把范围内的每个整点(每一维坐标均为整数的点)当做图上的顶点。设点 A(0,0,⋯,0),B(a_1,a_2,⋯,a_d)。对于范围内的点(x_1,x_2,⋯,x_d),它会向以下这些点(如果目标点在范围内)连有向边:(x_1+1,x_2,⋯,x_d),(x_1,x_2+1,⋯,x_d),⋯,(x_1,x_2,⋯,x_d+1)
现在从点 A 到点 B 会有若干条路径,路径的条数可以十分简单地算出。然而不幸的是,范围内有 p 个点被破坏了(点 A 和点 B 不会被破坏) ,其中第 i个点的坐标为(x_(i,1),x_(i,2),⋯,x_(i,d))。你需要算出从点 A 到点B 剩余的路径条数。
由于答案可能很大,你只需要输出它对 1,000,000,007 取模的结果。
【输入格式】
第一行为两个整数 d,p。
第二行为 d 个整数,其中第 i 个数是 a_i。
接下来 p 行,每行 d 个整数,其中第 i 行第 j 个数是 x_(i,j)。
【输出格式】
一个整数,表示从点 A 到点 B 剩余的路径条数对 1,000,000,007 取模的结果。
【输入样例】
2 1
2 1
1 0
【输出样例】
1
【数据范围】
30分算法
• 在前30分当中,数据规模非常小,可以暴搜每条路线。
d=1的算法
• 对于d=1的情况,如果没有点被破坏则答案是1,否则答案是0。
p=0的算法
•运用排列组合公式:二维:C(n,n+m);
多维:

阶乘可以暴力算,注意除法要用逆元(费马小定理求逆元)算。


【题解】【dp+组合数+容斥原理】
【f[i]表示从A到i不经过被破坏的点的路径条数;g[i][j]表示从i到j可以经过的被破坏的点的方案数(可以用组合数求)】
【g[i][j]:(各维度权值之和的阶乘)/(各维度阶乘之积),如二维情况:(行数+列数)!/(行数!×列数!)】
【f[i]=总路径条数-不合法,f[x]=g[A][x]-Σf[y]*g[y][x]】
【最后输出f[B]】
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define man 10000010
#define sc(x) scanf("%d",&x)
#define ll long long
#define mod 1000000007
using namespace std;
struct node
{
int x[];
}a[];//每个点的坐标
ll mi[man],sum[],f[],g[][],h[];
/*
mi[]:求i的阶乘;
sum[]:每个点的坐标和(为了之后的p=0做准备);
f[]:从A到i不经过被破坏的点的路径条数;
g[][]:从i到j可以经过的被破坏的点的方案数(可以用组合数求);
h[]:每两个点坐标之间的差值;
*/
int d,p;
int cmp(node a,node b)
{
for(int i=;i<=d;i++)
{
if(a.x[i]<b.x[i])return ;
if(a.x[i]>b.x[i])return ;
}
}
// cmp:从一维开始从小到大排序;
inline void pow1()
{ mi[]=;
for(ll i=;i<=;i++)
mi[i]=(mi[i-]*i)%mod;
}
//pow1:计算阶乘;
ll bpow(int a,int b)
{
ll ans=,base=a;
while(b)
{
if(b&) ans=ans*base%mod;
base=base*base%mod;
b>>=;
}
return ans;
}
//快速幂;
inline void solve()
{
for(int i=;i<=p;i++)
{
ll t=mi[sum[i]];
ll t1=;
for(int j=;j<=d;j++)
if(a[i].x[j])
t1=(t1*mi[a[i].x[j]])%mod;
ll ans=bpow(t1,mod-);
g[][i]=t*ans%mod;
}//运用费马小定理计算从A点至各点的路径总数;
for(int i=;i<=p;i++)
for(int j=;j<=p;j++)
{
ll tot=;bool b=;
for(int k=;k<=d;k++)
{
h[k]=a[j].x[k]-a[i].x[k];
tot+=h[k];
if(h[k]<) //因为是单向边(从i至j),所以j-i的坐标差>=0;
{
b=;
break;
}
}
if(!b) continue;
ll t=mi[tot];
ll t1=;
for(int k=;k<=d;k++)
if(h[k]) t1=(t1*mi[h[k]])%mod;
ll ans=bpow(t1,mod-);
g[i][j]=t*ans%mod;
}//运用费马小定理求两点之间路径总数;
return ;
} int main()
{ freopen("cube.in","r",stdin);
freopen("cube.out","w",stdout);
sc(d);sc(p);
p++;
for(int i=;i<=d;i++)
sc(a[p].x[i]);//每维极值相当于B点(终点)坐标;
for(int i=;i<=p-;i++)
for(int j=;j<=d;j++)
sc(a[i].x[j]);
sort(a+,a++p,cmp);
for(int i=;i<=p;i++)
for(int j=;j<=d;j++)
{sum[i]+=a[i].x[j];sum[i]%=mod;}
pow1();
solve();//预处理g[i][j];
for(int i=;i<=p;i++)
{
f[i]=g[][i]%mod;
for(int j=;j<i;j++)
f[i]=(f[i]-f[j]*g[j][i])%mod;
f[i]=(f[i]%mod+mod)%mod;
}
cout<<f[p]<<endl;
return ;
}
费马小定理:a/b mod p ==a* b^p-2 mod p;
证明略。
STREAMING #5 题解 3.高位网络的更多相关文章
- 【简】题解 P4297 [NOI2006]网络收费
传送门:P4297 [NOI2006]网络收费 题目大意: 给定一棵满二叉树,每个叶节点有一个状态(0,1),任选两个叶节点,如果这两个叶节点状态相同但他们的LCA所管辖的子树中的与他们状态相同的叶节 ...
- 【题解】HNOI2016网络
整体二分是个好东西!可我忘记了它QAQ其实当你知道这题可以整体二分的时候就已经不难了(个人觉得这是最难想到的一点啊).整体二分的话,我们就可以把问题转化为是否有一条权值 \(>= k\) 的链经 ...
- CCF-CSP题解 201403-4 无线网络
新建不超过\(k\)个无线路由器,求使路由器1.2连通最少的中间路由器. 首先常规建图,将相距不超过\(r\)的路由器(包括新建的)相连. 想到了分层\(dijkstra\).类似的,作\(bfs\) ...
- CCF-CSP题解 201709-4 通信网络
dfs #include <bits/stdc++.h> const int maxn = 1000; const int maxm = 10000; using namespace st ...
- 【题解】2021CSP-J2T3网络连接
目录 题目链接 题目分析 是否重复 读入提取数 非法情况判断 参考代码 题目链接 题目分析 map不会冲突!!不一定要like代码中那样加-号! 模拟,算不上大, 首先,我们想想整个流程: 现在,我们 ...
- 网络-01-端口号-linux端口详解大全
0 | 无效端口,通常用于分析操作系统1 | 传输控制协议端口服务多路开关选择器2 | 管理实用程序3 | 压缩进程5 | 远程作业登录7 | 回显9 | 丢弃11 | 在线用户13 | 时间17 | ...
- noip做题记录+挑战一句话题解?
因为灵巧实在太弱辽不得不做点noip续下命QQAQQQ 2018 积木大赛/铺设道路 傻逼原题? 然后傻逼的我居然检查了半天是不是有陷阱最后花了差不多一个小时才做掉我做过的原题...真的傻逼了我:( ...
- CCF-CSP认证 C++题解目录
持续更新中,记录刷题过程并分享一下小小的心得总结. 试题编号 试题名称 标签 202006-1 线性分类器 | 题解 线性规划 202006-2 稀疏向量| 题解 归并排序思想 202006-3 化学 ...
- [BZOJ2072][POI2004] MOS过桥
Description 一个夜晚一些旅行者想要过桥. 他们只有一个火把. 火把的亮光最多允许两个旅行者同时过桥. 没有火把或者多于2个人则不能过桥.每个旅行者过桥都需要特定的时间, 两个旅行者同时过桥 ...
随机推荐
- Unit06: 外部对象概述 、 window 对象 、 document 对象
Unit06: 外部对象概述 . window 对象 . document 对象 小代码演示: <!DOCTYPE html> <html> <head> < ...
- Apache的下载安装(主要说的 64位)及问题
本文转载自:http://blog.csdn.net/qq_15096707/article/details/47319545 今天重装完win10系统,就重新下载安装 Apache.虽说之前有安装过 ...
- linux安装oracle12c
参考: https://blog.csdn.net/who__are__you_/article/details/79178303 记录:
- (转)winform安装项目、安装包的制作、部署
本文转载自:http://zhan.renren.com/cxymst?gid=3602888498037535727&from=post&checked=true 1,解决方案—添加 ...
- java web 程序---登陆的验证码实现显示
是一个java文件 package com.sss; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; im ...
- Mysql无法创建外键的原因 !!!
在MySQL中创建外键时,经常会遇到问题而失败,这是因为Mysql中还有很多细节需要我们去留意,我自己总结并查阅资料后列出了以下几种常见原因. 1. 两个字段的类型或者大小不严格匹配.例如,如果一个 ...
- html5的canvas方法的总结
canvas的方法 save()保存当前环境的状态 restore() 返回之前保存过的路径状态和属性 createEvent() getContext()返回一个对象,指出访问绘图功能必要的API ...
- 【BZOJ】1012: [JSOI2008]最大数maxnumber /【洛谷】1198(线段树)
Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插 ...
- 一些通用的触发移动App崩溃的测试场景
一些通用的触发移动App崩溃的测试场景,如下: 1 验证在有不同的屏幕分辨率,操作系统和运营商的多个设备上的App行为. 2 用新发布的操作系统版本验证App的行为. 3 验证在如隧道,电梯等网络质量 ...
- stm32通信概述
本文提到的内容有以下几个方面: 通信概述 串口通信 I2C通信 CAN通信 SPI通信 I2S通信 USB通信 其他通信 一.通信概述 按照数据传送方式分: 串行通信(一条数据线.适合远距离传输.控制 ...