以下内容来自ShallWe's Blog

题目

高维网络

现在有一个\(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 取模的结果。

解题报告

好简单的题,没什么好说的。
因为坏点的个数很少,并且维数也不大,完全可以承受\(O(p^2*d)\)的复杂度。
突破点:统计\(f[i]\)表示从\(A\)点到\(i\)点,不经过其他坏点的方案数 ,很显然的一点是,总方案数-每个点作为第一个坏点的方案数为答案。
这就很容易了,只需要一个C(x,y)的函数:

inline int C(int x,int y){long long tmp=1;int sum=0; for (int i=1;i<=d;i++){tmp=che(tmp,inv[bad[y].x[i]-bad[x].x[i]]);sum+=bad[y].x[i]-bad[x].x[i];}tmp=che(tmp,mul[sum]); return (int)tmp;
}

这是统计方案数的函数,意思大概是将所有步求全排列再除去同种步的阶乘,简单易懂
然后 \(f[i]=C(A,i)-f[j](j \to i)\).简单易懂。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
using namespace std;
const int N=501;
const int D=101;
const int M=1000000007;
struct badpoint{int x[D];
} bad[N+1];
struct E{int next,to; E(int next=0,int to=0) :next(next),to(to){}
} e[N*N];
int mul[10000001],inv[10000001];
int f[N],d,n,a[N],head[N],tot;
inline int che(int x,int y){long long a=x,b=y,c=a*b%M;return (int)c;
}
inline void cha(int &x,int y){x=(x-y+M)%M;
}
inline int qpow(int x,int k){long long ans=1,tmp=x; for (int i=k;i;i>>=1){if (i&1) ans=ans*tmp%M; tmp=tmp*tmp%M;}return (int)ans;
}
void init(){mul[0] = 1;for (int i=1;i<=10000000;i++) mul[i]=che(mul[i-1],i);inv[10000000]=qpow(mul[10000000],M-2);for (int i=10000000-1;i>0;i--)inv[i]=che(inv[i+1],i+1);inv[0]=1;
}
inline void in(int &x){char ch=getchar(); for (;ch<'0'||ch>'9';ch=getchar());for (x=0;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-48;
}
inline void add(int x,int y){e[++tot]=E(head[x],y); head[x]=tot;
}
inline bool judge(int x,int y){for (int i=1;i<=d;i++) if (bad[x].x[i]>bad[y].x[i]) return 0; return 1;
}
inline int C(int x,int y){long long tmp=1;int sum=0; for (int i=1;i<=d;i++){tmp=che(tmp,inv[bad[y].x[i]-bad[x].x[i]]);sum+=bad[y].x[i]-bad[x].x[i];}tmp=che(tmp,mul[sum]); return (int)tmp;
}
inline int dp(int x){if (f[x]!=-1) return f[x]; f[x]=C(0,x); int y;for (int i=head[x];i;i=e[i].next){y=e[i].to; cha(f[x],che(dp(y),C(y,x))); }return f[x];
}
int main(){freopen("cube.in","r",stdin); freopen("cube.out","w",stdout);init();in(d),in(n);for (int i=1;i<=d;i++) in(a[i]),bad[n+1].x[i]=a[i];for (int i=1;i<=n;i++) for (int j=1;j<=d;j++) in(bad[i].x[j]); for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) if (i!=j&&judge(i,j))add(j,i);int y;memset(f,-1,sizeof(f));for (int i=1;i<=n;i++)dp(i); int ans=C(0,n+1);for (int i=1;i<=n;i++)cha(ans,che(f[i],C(i,n+1)));printf("%d\n",ans); return 0;
}

转载于:https://www.cnblogs.com/ShallWe2000/p/5762460.html

高维网络(dp+容斥?)相关推荐

  1. Codeforces Round #257 (Div. 1) D. Jzzhu and Numbers 高维前缀和 + 容斥

    传送门 文章目录 题意: 思路: 题意: 思路: 完全想不到容斥啊,看了半天也没看懂渍渍渍. 定义f[i]f[i]f[i]表示iii的超集个数,那么选择的方案就是2f[i]−12^{f[i]}-12f ...

  2. BZOJ2339: [HNOI2011]卡农(dp 容斥)

    题意 从$1 - n$中任意选择一些数,选$m$次构成$m$个集合 保证: 集合不为空 任意两个集合不相同 集合内各个元素xor起来等于0 Sol 神仙题Orz 我看到两种做法,一种是洛谷题解上的直接 ...

  3. CF296B dp\容斥

    传送门 文章目录 题意: 思路: 题意: n≤1e5n\le1e5n≤1e5 思路: 求方案数基本就是考虑dpdpdp了,看到nnn这么大可以考虑一下分情况讨论的dpdpdp状态. 设f[i][j]f ...

  4. [CQOI2012] 局部极小值(状压DP + 容斥 + 搜索)

    problem luogu-P3160 solution 这么小的数据范围,非暴力不状压.暴力 O(28!)O(28!)O(28!) 呵呵呵可以拉走了. 我们不妨从小到大填数字,这样如果局部极小值点还 ...

  5. P5405-[CTS2019]氪金手游【树形dp,容斥,数学期望】

    前言 话说在LojLojLoj下了个数据发现这题的名字叫fgofgofgo 正题 题目链接:https://www.luogu.com.cn/problem/P5405 题目大意 nnn张卡的权值为1 ...

  6. AT4352-[ARC101C] Ribbons on Tree【dp,容斥】

    正题 题目链接: https://www.luogu.com.cn/problem/AT4352 https://atcoder.jp/contests/arc101/tasks/arc101_c 题 ...

  7. bzoj 1042: [HAOI2008]硬币购物(dp+容斥)

    1042: [HAOI2008]硬币购物 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2555  Solved: 1537 [Submit][St ...

  8. [LOJ#3119][Luogu5405][CTS2019]氪金手游(DP+容斥)

    先考虑外向树的做法,显然一个点在其子树内第一个出现的概率等于它的权值除以它子树的权值和.于是f[i][j]表示i的子树的权值和为j时,i子树内所有数的相互顺序都满足条件的概率,转移直接做一个背包卷积即 ...

  9. [LOJ#3124][CTS2019]氪金手游(概率 + 树形 DP + 容斥)

    Address 洛谷 P5405 LOJ #3124 Solution 先考虑如果以某个点(下面定为 111 )为根时,如果所有的限制二元组 (u,v)(u,v)(u,v) 都满足 uuu 是 vvv ...

最新文章

  1. Samba的主配置文件
  2. Software Engineering | Factory method pattern
  3. elasticsearch6.2.2安装中文分词插件IK analyzer
  4. 成功解决AttributeError: 'list' object has no attribute 'shape'
  5. centos 6.4 FTP安装和配置
  6. python 1+2+3+4+5+6+7+8+9累加求和_求1!+2!+3!+4!+5!+6!+7!+8!+9!+10!+...+N! N阶阶乘求和算法 JAVA C Python...
  7. STM32F103:二.(2)串口控制LED
  8. DNS 反向解析出错 Error in named configuration: zone centos.vbird/IN: loaded serial 2011080401
  9. python 抓取电脑界面_学会了Python,我的人生跟开挂一样
  10. 计算机算法设计与分析 最长子序列
  11. 在vue中使用echarts之世界各地到中国某些城市的航线
  12. 神州数码java面试
  13. 第一次参加本校大学生创新创业训练项目答辩的反思与总结
  14. docker卸载提示Device or resource busy
  15. tensorflow serving入门笔记
  16. 【缓存中间件】redis 支持的数据类型
  17. PYNQ开发板使用-使用DMA进行数据搬移(Simple DMA transfer 模式)
  18. 面向全球用户的Teams app之时区篇
  19. C#listbox用法
  20. redux和react-redux

热门文章

  1. Android笔记 style样式
  2. Android笔记 notification
  3. 单片机单口不可用或被占用_单片机为什么一直用C语言,不用其他编程语言?只有学过的知道...
  4. 一行代码解决:jupyter中OSError: [Errno 99] Cannot assign requested address错误
  5. 从零开始学Pytorch(十六)之模型微调
  6. 酷安电脑版_2020年末 平板电脑购买推荐
  7. 在stackoverflow上使用markdown
  8. android studio 横幅,有关 android studio notification 横幅弹出的功能没有反应
  9. python获取时间秒数_Python获取秒级时间戳与毫秒级时间戳
  10. 【NLP】毕设学习笔记(七)前馈神经网络代表者——卷积神经网络无公式理解