高维网络

【题目描述】 
现在有一个 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 
【输出样例】 

【数据范围】 

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]】

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<algorithm>
  5. #define man 10000010
  6. #define sc(x) scanf("%d",&x)
  7. #define ll long long
  8. #define mod 1000000007
  9. using namespace std;
  10. struct node
  11. {
  12. int x[];
  13. }a[];//每个点的坐标
  14. ll mi[man],sum[],f[],g[][],h[];
  15. /*
  16. mi[]:求i的阶乘;
  17. sum[]:每个点的坐标和(为了之后的p=0做准备);
  18. f[]:从A到i不经过被破坏的点的路径条数;
  19. g[][]:从i到j可以经过的被破坏的点的方案数(可以用组合数求);
  20. h[]:每两个点坐标之间的差值;
  21. */
  22. int d,p;
  23. int cmp(node a,node b)
  24. {
  25. for(int i=;i<=d;i++)
  26. {
  27. if(a.x[i]<b.x[i])return ;
  28. if(a.x[i]>b.x[i])return ;
  29. }
  30. }
  31. // cmp:从一维开始从小到大排序;
  32. inline void pow1()
  33. { mi[]=;
  34. for(ll i=;i<=;i++)
  35. mi[i]=(mi[i-]*i)%mod;
  36. }
  37. //pow1:计算阶乘;
  38. ll bpow(int a,int b)
  39. {
  40. ll ans=,base=a;
  41. while(b)
  42. {
  43. if(b&) ans=ans*base%mod;
  44. base=base*base%mod;
  45. b>>=;
  46. }
  47. return ans;
  48. }
  49. //快速幂;
  50. inline void solve()
  51. {
  52. for(int i=;i<=p;i++)
  53. {
  54. ll t=mi[sum[i]];
  55. ll t1=;
  56. for(int j=;j<=d;j++)
  57. if(a[i].x[j])
  58. t1=(t1*mi[a[i].x[j]])%mod;
  59. ll ans=bpow(t1,mod-);
  60. g[][i]=t*ans%mod;
  61. }//运用费马小定理计算从A点至各点的路径总数;
  62. for(int i=;i<=p;i++)
  63. for(int j=;j<=p;j++)
  64. {
  65. ll tot=;bool b=;
  66. for(int k=;k<=d;k++)
  67. {
  68. h[k]=a[j].x[k]-a[i].x[k];
  69. tot+=h[k];
  70. if(h[k]<) //因为是单向边(从i至j),所以j-i的坐标差>=0;
  71. {
  72. b=;
  73. break;
  74. }
  75. }
  76. if(!b) continue;
  77. ll t=mi[tot];
  78. ll t1=;
  79. for(int k=;k<=d;k++)
  80. if(h[k]) t1=(t1*mi[h[k]])%mod;
  81. ll ans=bpow(t1,mod-);
  82. g[i][j]=t*ans%mod;
  83. }//运用费马小定理求两点之间路径总数;
  84. return ;
  85. }
  86.  
  87. int main()
  88. { freopen("cube.in","r",stdin);
  89. freopen("cube.out","w",stdout);
  90. sc(d);sc(p);
  91. p++;
  92. for(int i=;i<=d;i++)
  93. sc(a[p].x[i]);//每维极值相当于B点(终点)坐标;
  94. for(int i=;i<=p-;i++)
  95. for(int j=;j<=d;j++)
  96. sc(a[i].x[j]);
  97. sort(a+,a++p,cmp);
  98. for(int i=;i<=p;i++)
  99. for(int j=;j<=d;j++)
  100. {sum[i]+=a[i].x[j];sum[i]%=mod;}
  101. pow1();
  102. solve();//预处理g[i][j];
  103. for(int i=;i<=p;i++)
  104. {
  105. f[i]=g[][i]%mod;
  106. for(int j=;j<i;j++)
  107. f[i]=(f[i]-f[j]*g[j][i])%mod;
  108. f[i]=(f[i]%mod+mod)%mod;
  109. }
  110. cout<<f[p]<<endl;
  111. return ;
  112. }

费马小定理:a/b mod p ==a* b^p-2 mod p;

证明略。

STREAMING #5 题解 3.高位网络的更多相关文章

  1. 【简】题解 P4297 [NOI2006]网络收费

    传送门:P4297 [NOI2006]网络收费 题目大意: 给定一棵满二叉树,每个叶节点有一个状态(0,1),任选两个叶节点,如果这两个叶节点状态相同但他们的LCA所管辖的子树中的与他们状态相同的叶节 ...

  2. 【题解】HNOI2016网络

    整体二分是个好东西!可我忘记了它QAQ其实当你知道这题可以整体二分的时候就已经不难了(个人觉得这是最难想到的一点啊).整体二分的话,我们就可以把问题转化为是否有一条权值 \(>= k\) 的链经 ...

  3. CCF-CSP题解 201403-4 无线网络

    新建不超过\(k\)个无线路由器,求使路由器1.2连通最少的中间路由器. 首先常规建图,将相距不超过\(r\)的路由器(包括新建的)相连. 想到了分层\(dijkstra\).类似的,作\(bfs\) ...

  4. CCF-CSP题解 201709-4 通信网络

    dfs #include <bits/stdc++.h> const int maxn = 1000; const int maxm = 10000; using namespace st ...

  5. 【题解】2021CSP-J2T3网络连接

    目录 题目链接 题目分析 是否重复 读入提取数 非法情况判断 参考代码 题目链接 题目分析 map不会冲突!!不一定要like代码中那样加-号! 模拟,算不上大, 首先,我们想想整个流程: 现在,我们 ...

  6. 网络-01-端口号-linux端口详解大全

    0 | 无效端口,通常用于分析操作系统1 | 传输控制协议端口服务多路开关选择器2 | 管理实用程序3 | 压缩进程5 | 远程作业登录7 | 回显9 | 丢弃11 | 在线用户13 | 时间17 | ...

  7. noip做题记录+挑战一句话题解?

    因为灵巧实在太弱辽不得不做点noip续下命QQAQQQ 2018 积木大赛/铺设道路 傻逼原题? 然后傻逼的我居然检查了半天是不是有陷阱最后花了差不多一个小时才做掉我做过的原题...真的傻逼了我:( ...

  8. CCF-CSP认证 C++题解目录

    持续更新中,记录刷题过程并分享一下小小的心得总结. 试题编号 试题名称 标签 202006-1 线性分类器 | 题解 线性规划 202006-2 稀疏向量| 题解 归并排序思想 202006-3 化学 ...

  9. [BZOJ2072][POI2004] MOS过桥

    Description 一个夜晚一些旅行者想要过桥. 他们只有一个火把. 火把的亮光最多允许两个旅行者同时过桥. 没有火把或者多于2个人则不能过桥.每个旅行者过桥都需要特定的时间, 两个旅行者同时过桥 ...

随机推荐

  1. 配置Jar包及相关依赖Jar包的本地存放路径

    配置Jar包及相关依赖Jar包的本地存放路径 用 maven2 ,pom.xml中设置了依赖,会帮你下载所有依赖的.jar到 M2_REPO 指向的目录. M2_REPO是一个用来定义 maven 2 ...

  2. 干净的 js测试页面

    <!DOCTYPE html><html lang="en" > <head> <meta charset="utf-8&quo ...

  3. 可复用的自定义Adapter

    public abstract class MyAdapter<T> extends BaseAdapter { private ArrayList<T> mData; pri ...

  4. struts2学习(3)struts2核心知识II

    一.struts.xml配置: 1.分模块配置方法: 比如某个系统多个模块,我们把资产管理模块和车辆管理模块,分开,在总的struts.xml配置文件中include他们: 工程结构: struts. ...

  5. java web 程序---在线时长

    思路:toLocalString()这个方法 <body> <% long t=session.getLastAccessedTime(); long t2=session.getC ...

  6. 使用SLF4J和LOGBACK (一 : 基本使用)

    1.SLF4J是什么? slf4j是一个日志门面,它不是具体的日志实现框架,而是提供了通用的日志接口,按个人理解来说,是通过接口实现多态,来满足应用在不同日志框架间切换的需求. 例如在程序中我们需要记 ...

  7. Understanding OpenStack Authentication: Keystone PKI

    The latest stable release of OpenStack, codenamed Grizzly, revolutionizes the way user authenticatio ...

  8. Cocos开发前准备

    Cocos2d-HTML5( http://www.cocos2d-x.org )引擎 代码编辑器:webstorm (http://www.jetbrains.com/)+ Sublime Text ...

  9. 二、jenkins配置email(以腾讯企业qq为例)

    废话不多说,直接上干货: 主要针对两个部分进行介绍: 1.jenkins内置的邮件功能: 2.Editable Email Notification插件的邮件功能: 低版本的jenkins有很多插件都 ...

  10. Android MVP模式简单易懂的介绍方式 (二)

    Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 上一篇文章我们介绍完了Model的创建 ...